环境要求
基础环境
- php:7.2
- elasticsearch:7.6.1
安装配置
- tamayo/laravel-scout-elastic:8.0
- elasticsearch/elasticsearch: 7.9
- laravel/scout: 8.0
laravel 的 Scout 包是针对自身的 Eloquent 模型开发的基于驱动的全文检索引擎。意思就是我们可以像使用 ORM 一样使用检索功能。不管你用的是什么搜索引擎,scout 包给你封装好了几个方法,安装tamayo/laravel-scout-elastic扩展包以es搜索引擎使用scout包进行搜索。
发现问题
- 直接调用paginate方法会报错:PHP Fatal error: Unsupported operand types
原因:tamayo/laravel-scout-elastic包中的ElasticsearchEngine文件中两个方法中,如下
public function paginate(Builder $builder, $perPage, $page)
{
$result = $this->performSearch($builder, [
'numericFilters' => $this->filters($builder),
'from' => (($page * $perPage) - $perPage),
'size' => $perPage,
]);
$result['nbPages'] = $result['hits']['total'] / $perPage;
return $result;
}
public function getTotalCount($results)
{
return $results['hits']['total'];
}
可能由于es版本原因,es7中返回hits属性中为
{
"hits": {
"total": {
"value": 1000,
"relation": "eq"
},
...
}
}
即必须要在代码中修改为$results['hits']['total']['value']。参考https://github.com/ErickTamayo/laravel-scout-elastic/pull/134
- 搜索的 query 强制使用通配符
具体代码可查看tamayo/laravel-scout-elastic包中的ElasticsearchEngine文件中performSearch
方法
$params = [
'index' => $builder->model->searchableAs(),
'type' => get_class($builder->model),
'body' => [
'query' => [
'bool' => [
'must' => [['query_string' => ['query' => "*{$builder->query}*"]]]
]
]
]
];
...
它在 query 的时候强制在搜索的前后使用上了通配符 *,这个在标准分词器中文搜索的时候会出现问题,会变成一个词,所以如果要使用标准分词器,需要把 query 的前后两个 * 都去掉。
自己优化了一小下,简单的搜索还是可以使用的https://github.com/banbans/laravel-scout-elastic
参考链接:https://learnku.com/articles/4351/application-of-laravel-scout-package-in-elasticsearch