Laravel中使用Scout+Elasticsearch搜索的心得

环境要求

基础环境
  • 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

你可能感兴趣的:(Laravel中使用Scout+Elasticsearch搜索的心得)