上篇文章搭建了 Elasticsearch 容器以及添加了測試數據,這篇來配置以及使用。php
composer require tamayo/laravel-scout-elastic
config/app.php
中 providers
添加 Laravel\Scout\ScoutServiceProvider::class
和 ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
config/scout.php
添加'elasticsearch' => [ 'index' => env('ELASTICSEARCH_INDEX', 'laravel'), 'hosts' => [ env('ELASTICSEARCH_HOST', 'http://localhost'), ], ],
.env
文件,因此添加以下配置項SCOUT_DRIVER=elasticsearch ELASTICSEARCH_INDEX=laravel_index ELASTICSEARCH_HOST=elasticsearch #由於環境是 laradock
修改 app/Models/FakeArticle.php
文件以下html
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Laravel\Scout\Searchable; class FakeArticle extends Model { Use Searchable; /** * 須要查詢的字段 * @return array */ public function toSearchableArray() { return $this->only('author', 'title', 'content'); } }
這一步是花費時間最多的地方,查的資料要麼是過期的,要麼根本不能運行。最終根據這篇文章修改而來。
關於 ik 分詞以及 ik_max_word
和 ik_smart
的區別,不在這裏贅述了,能夠看下這篇文章。laravel
新建文件 php artisan make:command InitEs
,編輯以下git
<?php namespace App\Console\Commands; use GuzzleHttp\Client; use Illuminate\Console\Command; class InitEs extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'init:es'; /** * The console command description. * * @var string */ protected $description = 'Elasticsearch 初始化配置'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $client = new Client(); $this->createTemplate($client); $this->createIndex($client); } /** * 建立模板 see https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html * @param Client $client */ private function createTemplate(Client $client) { $url = config('scout.elasticsearch.hosts')[0] . ':9200/_template/template_1'; $client->put($url, [ 'json' => [ 'template' => config('scout.elasticsearch.index'), 'settings' => [ 'number_of_shards' => 1, ], 'mappings' => [ '_default_' => [ 'dynamic_templates' => [ // 動態映射模板 [ 'string_fields' => [ // 字段映射模板的名稱,通常爲"類型_fields"的命名方式 'match' => '*', // 匹配的字段名爲全部 'match_mapping_type' => 'string', // 限制匹配的字段類型,只能是 string 類型 'mapping' => [ // 字段的處理方式 'type' => 'text', // 字段類型限定爲 string 'analyzer' => 'ik_max_word', // 字段採用的分析器名,默認值爲 standard 分析器 'fields' => [ 'raw' => [ 'type' => 'keyword', 'ignore_above' => 256, // 字段是索引時忽略長度超過定義值的字段。 ] ], ], ], ], ], ], ], ], ]); } /** * 建立索引 * @param Client $client */ private function createIndex(Client $client) { $url = config('scout.elasticsearch.hosts')[0] . ':9200/' . config('scout.elasticsearch.index'); $client->put($url, [ 'json' => [ 'settings' => [ 'refresh_interval' => '5s', 'number_of_shards' => 1, // 分片爲 'number_of_replicas' => 0, // 副本數 ], 'mappings' => [ '_default_' => [ '_all' => [ 'enabled' => false, // 是否開啓全部字段的檢索 ], ], ], ], ]); } }
php artisan init:es
php artisan scout:import "App\Models\FakeArticle"
FakeArticle::search('搜索詞')->get();
測試後沒有問題,能夠正常搜索。更多的方法參考這裏。github
參考資料:Elastic Driver for Laravel Scout、Laravel Scout + Elasticsearch + ik 分詞json