一: 安裝Elasticsearch和ik(中文外掛)
直接GitHub地址下載:https://github.com/medcl/elasticsearch-rtf
需要宣告的是執行環境必須支援以下:
1:.JDK8+
2:系統可用記憶體>2G
執行 Mac/Linux:
cd elasticsearch/bin
./elasticsearch
複製程式碼
sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -d
Windows:
cd elasticsearch/bin
elasticsearch.bat
複製程式碼
二: 安裝Elasticsearch的Laravel 的搜尋系統 Scout
1: 首先,使用 composer 包管理器來安裝 Scout:
composer require laravel/scout
接下來,你需要將 ScoutServiceProvider
新增到你的配置檔案 config/app.php
的providers
陣列中:
Laravel\Scout\ScoutServiceProvider::class,
註冊好 Scout 的服務提供器之後,你還需使用Artisan 命令 vendor:publish 生成 Scout 的配置檔案。這個命令會在你的 config 目錄下生成 scout.php 配置檔案:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
最後,將 Laravel\Scout\Searchable trait 加到你想要搜尋的模型中。
2: 安裝 Laravel Scout Elasticsearch Driver
composer require tamayo/laravel-scout-elastic
// config/app.php
'providers' => [
...
Laravel\Scout\ScoutServiceProvider::class,
...
ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
],
複製程式碼
修改scout.php
// config/scout.php
'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
...
'elasticsearch' => [
'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
'hosts' => [
env('ELASTICSEARCH_HOST', 'http://localhost:9200'),
],
],
...
複製程式碼
三: 建立Elasticsearch的模板和索引
1: 使用laravel的Command實現搜尋引擎索引和模版的建立
建立 PHP Artisan 命令
php artisan make:command ESInit
命令執行之後你會看到 app/console/commands/ESInit.php
新建立的檔案。
修改此檔案的一些內容如下:
// 執行指令碼命令的名稱
// 執行 php artisan es:init
protected $signature = 'es:init';
// 控制檯命令的描述,可以是中文
protected $description = '執行ES搜尋的命令';
複製程式碼
修改具體執行的方法 handle之前:
需要引入 use GuzzleHttp\Client;
如果沒有此擴充套件包,可以先下載之後引入
composer require guzzlehttp/guzzle
public function handle()
{
$client = new Client();
// 建立模版
$url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
$client->put($url, [
'json' => [
'template' => config('scout.elasticsearch.index'),
'settings' => [
'number_of_shards' => 1
],
'mappings' => [
'_default_' => [
'_all' => [
'enabled' => true
],
'dynamic_templates' => [
[
'strings' => [
'match_mapping_type' => 'string',
'mapping' => [
'type' => 'text',
'analyzer' => 'ik_smart',
'ignore_above' => 256,
'fields' => [
'keyword' => [
'type' => 'keyword'
]
]
]
]
]
]
]
]
]
]);
// 為了方便看到執行結果
$this->info("======= 建立模板成功 =======");
$url = config('scout.elasticsearch.hosts')[0] . '/' . 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
]
]
]
]
]);
// 為了方便看到執行結果
$this->info("======= 建立索引成功 =======");
}
複製程式碼
然後在 app\Console\Kernel.php
引入程式碼如下:
protected $commands = [
//
\App\Console\Commands\ESInit::class
];
複製程式碼
然後執行命令測試 php artisan es:init
如果你看到了
======= 建立模板成功 =======
======= 建立索引成功 =======
複製程式碼
說明你命令已經建立成功,接下來在你想要使用搜尋的模型中引入吧。
然後再你要使用的模型中引入並加入兩個方法 如下:(我是在Status模型下加入的)
use Laravel\Scout\Searchable;
class Status extends Model
{
use Searchable;
....
// 定義索引裡面的 type
public function searchableAs()
{
return "status";
}
// 定義有哪些欄位需要 搜尋
public function toSearchableArray()
{
return [
'content' => $this->content
];
}
...
}
複製程式碼
四: 新增資料和匯入已有資料
以上都完成之後,就可以匯入資料庫中的進行搜尋了。
執行命令 php artisan scout:import 模型名
比如 php artisan scout:import "App\Status"
能明顯看到你資料表中最大的ID是多少,當你看到類似如下的提示說明你已經匯入成功了。
Imported [\App\Status] models up to ID: 52
All [\App\Status] records have been imported.
複製程式碼
接下來你就可以通過URl訪問來測試檢視你要搜尋的資料了。
url: http://127.0.0.1:9200/laravel/status/4
laravel 代表你自己建立的索引的名字,就是如下 :ELASTICSEARCH_INDEX
的名字
'elasticsearch' => [
'index' => env('ELASTICSEARCH_INDEX', 'laravel'),
'hosts' => [
env('ELASTICSEARCH_HOST', 'http://localhost:9200'),
],
],
複製程式碼
五: 搜尋邏輯和資料展示
接下要做的就相對簡單了,新建一個路由如下: Route::get('status/search','StatusesController@search'); 新建一個對應的方法如下: // 搜尋頁面
public function search()
{
// 驗證提交的資料
$this->validate(request(),[
'query' => 'required'
]);
$query = request('query');
// 查詢
$posts = Status::search(request('query'))->paginate(10);
// 渲染
return view('static_pages/search', compact('posts', 'query'));
}
複製程式碼
前端頁面這裡就不寫了。就是基本的資料 foreach 渲染了。