利用ElasticSearch实现全文索引。
安装elasticsearch和ik插件
elasticsearch集成包下载(需要有java8 以上环境),此集成包包含了ElasticSearch和很多的插件,我们只需要保留其中的analysis-ik
中文分词插件即可。
# 1. 将插件列表重定向到文件中
/root/elasticsearch-rtf-master/bin/elasticsearch-plugin list > /tmp/plugin.log
#2. 删除文件中的analysis-ik项
#3. 删除多余的插件
cat /tmp/plugin.log | xargs -I {} /root/elasticsearch-rtf-master/bin/elasticsearch-plugin remove {}
#4. 后台启动
/root/elasticsearch-rtf-master/bin/elasticsearch -d
安装Laravel使用的ElasticSearch的包
安装laravel/scout
安装scout的es驱动
Laravel自定义命令行
创建Command
- 创建命令文件
php artisan make:command esInit
- 打开
APP\Console\comamnds\EsInit.php
文件,修改其内容为
...
protected $signature = 'es:init';
protected $desciption = 'this is a description';
// 这是这个命令将要执行的任务
public function handle(){
// 需要先命令行执行composer require guzzlehttp/guzzle
// 创建 index
$client = new Client();
$url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
$client -> delete($url);
$client->put($url, [
'json' => [
'template' => config('scout.elasticsearch.index'),
'mappings' => [
'_default' => [
'dynamic_templates' => [
...
]
]
],
]
])
// 创建 template
...
}
- 打开
app/Console/kernel.php
文件,修改其内容为:
protected $command = [
\App\Console\Commands\EsInit::class,
];
- 此时已经可以通过
php artisan
使用这个命令了。
将MySQL的数据导入到ElasticSearch中去
- 在数据表对应的模型中引入搜索模块
...
use Laravel\Scout\Searchable
....
use Searchable;
...
public function searchable() {
return 'post';
}
// 定义用来搜索的字段
public function toSearchableArray(){
return [
'title' => $this->title,
'content' => $this-> content,
];
}
- 将MySQl中的数据导入到ElasticSearch中
php artisan scout:import "\App\Post"
- 此时在数据写入数据库时,数据也会自动写入到ElasticSearch中;
增加搜索页面及搜索逻辑
public function search() {
$this->validate(request, [
'query' => 'required',
]);
$query = request('query');
$posts = \App\Post->search($post) -> get(); // 核心方法 可使用paginate进行分页
...
}
此时,就可以通过ElasticSearch来进行搜索了。
网友评论