環(huán)境要求
基礎(chǔ)環(huán)境
- php:7.2
- elasticsearch:7.6.1
安裝配置
- tamayo/laravel-scout-elastic:8.0
- elasticsearch/elasticsearch: 7.9
- laravel/scout: 8.0
laravel 的 Scout 包是針對(duì)自身的 Eloquent 模型開(kāi)發(fā)的基于驅(qū)動(dòng)的全文檢索引擎骗随。意思就是我們可以像使用 ORM 一樣使用檢索功能放刨。不管你用的是什么搜索引擎,scout 包給你封裝好了幾個(gè)方法桨踪,安裝tamayo/laravel-scout-elastic擴(kuò)展包以es搜索引擎使用scout包進(jìn)行搜索。
發(fā)現(xiàn)問(wèn)題
- 直接調(diào)用paginate方法會(huì)報(bào)錯(cuò):PHP Fatal error: Unsupported operand types
原因:tamayo/laravel-scout-elastic包中的ElasticsearchEngine文件中兩個(gè)方法中袜硫,如下
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 強(qiáng)制使用通配符
具體代碼可查看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 的時(shí)候強(qiáng)制在搜索的前后使用上了通配符 *讨阻,這個(gè)在標(biāo)準(zhǔn)分詞器中文搜索的時(shí)候會(huì)出現(xiàn)問(wèn)題,會(huì)變成一個(gè)詞,所以如果要使用標(biāo)準(zhǔn)分詞器银萍,需要把 query 的前后兩個(gè) * 都去掉变勇。
自己優(yōu)化了一小下,簡(jiǎn)單的搜索還是可以使用的https://github.com/banbans/laravel-scout-elastic
參考鏈接:https://learnku.com/articles/4351/application-of-laravel-scout-package-in-elasticsearch