美文网首页
Laravel中使用Scout+Elasticsearch搜索的

Laravel中使用Scout+Elasticsearch搜索的

作者: banbans | 来源:发表于2020-11-20 16:26 被阅读0次

    环境要求

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

          本文链接:https://www.haomeiwen.com/subject/fvodiktx.html