簡介
Laravel Scout 是針對Eloquent 模型開發(fā)的一個簡單的,基于驅(qū)動的全文檢索系統(tǒng)。Scout 使用模型觀察者時會自動保持你的檢索索引與你的 Eloquent 記錄同步。
目前缆蝉,Scout 帶著一個Algolia驅(qū)動帜慢;然而草巡,擴展 Scout 并不難,你可以通過自定義驅(qū)動來自由的擴展 Scout眠寿。接下來我們就自定義搜索引擎elasticsearch來擴展Scount躬翁。
ElasticSearch是一個基于Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎盯拱,基于RESTful web接口盒发。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布狡逢,是當(dāng)前流行的企業(yè)級搜索引擎宁舰。
下載并安裝elasticsearch
(1)使用elasticsearch的前提是你的主機必須安裝了java的JDK,而且版本必須是1.8以上甚侣。安裝JDK明吩,并設(shè)置JAVA_HOME環(huán)境變量间学。
(2)解壓安裝包殷费,使用cmd命令進入到\bin,首先我們可以使用命令elasticsearch-plugin list 查看插件低葫,我們可以看到會列出一串的插件详羡,但是我們只需要其中analysis-ik插件,如果你的主機不夠強大嘿悬,建議可以刪除其他不必要的插件实柠,因為會消耗主機的大部分資源,直接刪除\plugins中除了analysis-ik的其他插件善涨。
(3)重新cmd鍵入elasticsearch-plugin list 查看插件
(4)啟動窒盐,cmd鍵入elasticsearch -d,在瀏覽器地址了中輸入127.0.0.1:9200钢拧,我們可以看到如下圖:
安裝Scout
(1)首先蟹漓,使用 composer 包管理器來安裝 Scout,如果沒有安裝 composer 包管理器源内,要先安裝葡粒;接著進入laravel項目的根目錄使用composer 命令安裝
composer require laravel/scout
(2)接下來,你需要將 ScoutServiceProvider 添加到你的 config/app.php 配置文件的 providers 數(shù)組中:
Laravel\Scout\ScoutServiceProvider::class,
(3)注冊好 Scout 的服務(wù)提供者之后,你可以使用 vendor:publish Artisan 命令生成 Scout 的配置文件嗽交。這個命令會在你的 config 目錄下生成 scout.php 配置文件:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
(4)使用 composer安裝scout的es驅(qū)動:
composer require tamayo/laravel-scout-elastic
(5)安裝完驅(qū)動之后卿嘲,修改config\scout.php配合文件,將驅(qū)動修改為elasticsearch
'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
并在下方添加驅(qū)動:
'elasticsearch' => [
//laravel54是項目名夫壁,可以自定義
'index' => env('ELASTICSEARCH_INDEX', 'laravel54'),
'hosts' => [
env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
],
],
創(chuàng)建command命令
(1)使用php artisan創(chuàng)建command命令
php artisan make:command ESInit
(2)執(zhí)行完命令后會創(chuàng)建app\Console\Command\ESInit.php文件拾枣,修改ESInit.php
//使用什么命令啟動腳本
protected $signature = 'es:init';
//描述
protected $description = 'init laravel es for post';
(3)在app\Console\Kernel.php中掛載
protected $commands = [
\App\Console\Commands\ESInit::class
];
完成之后使用php artisan命令查看命令是否掛載成功
安裝guzzlehttp/guzzle 擴展
composer require guzzlehttp/guzzle
配置
(1)修改app\Console\Command\ESInit.php
public function handle()
{
//創(chuàng)建template
$client=new Client();
$url=config('scout.elasticsearch.hosts')[0]. '/_template/tmp';
//$client->delete($url);
$param = [
'json'=>[
'template' => config('scout.elasticsearch.index'),
'mappings' => [
'_default_' => [
'dynamic_templates' => [
[
'strings' => [
'match_mapping_type' => 'string',
'mapping' => [
'type' => 'text',
'analyzer' => 'ik_smart',
'fields' => [
'keyword' => [
'type' => 'keyword'
]
]
]
]
]
]
]
],
],
];
$client->put($url,$param);
//記錄
$this->info("=======創(chuàng)建模板成功=======");
//創(chuàng)建index
$url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
//$client->delete($url);
$param=[
'json' => [
'settings' => [
'refresh_interval' => '5s',
'number_of_shards' => 1,
'number_of_replicas' => 0,
],
'mappings' => [
'_default_' => [
'_all' => [
'enabled' => false
]
]
]
]
];
$client->put($url,$param);
//記錄
$this->info("=========創(chuàng)建索引成功=========");
}
(2)在我的項目中我使用文章數(shù)據(jù)表來搜索,因此需要修改post.php盒让,也就是posts數(shù)據(jù)對于的數(shù)據(jù)模型
use Searchable;
//定義索引里面的type
public function searchableAs()
{
return "post";
}
//定義有哪些字段需要搜索
public function toSearchableArray()
{
return [
'title'=>$this->title,
'content'=>$this->content,
];
}
導(dǎo)入數(shù)據(jù)
使用php artisan命令導(dǎo)入數(shù)據(jù)
php artisan scout:import "\App\Post"
導(dǎo)入成功之后我們在瀏覽器地址輸欄入:127.0.0.1:9200/laravel54/post/23(laravel54是elasticsearch驅(qū)動定義的項目名放前,post對象的是我項目的post數(shù)據(jù)模型,23是某條數(shù)據(jù)的ID )