Elasticsearch edge_ngram出现无关结果 自定义排序下min_score失效问题问询
问题1:edge_ngram返回无关前缀结果的解决方案
出现该问题的核心原因是当前索引和查询阶段共用了同一个edge_ngram分析器:搜索"abcd"时,查询词会被切分为abc、abcd两个分词,只要文档包含abc分词就会命中,因此返回了前缀为abc的无关结果。
修改方案如下:
- 调整mapping配置,给search_by字段指定独立的查询分析器,查询时不对搜索词做edge_ngram切分,完整匹配目标前缀:
'search_by' => [ 'type' => 'text', 'analyzer' => 'autocomplete', 'search_analyzer' => 'standard' // 新增配置,查询时用标准分析器,不做ngram切分 ]
如果搜索词不需要拆分(比如是连续的固定字符串),也可以把search_analyzer设为keyword,保证查询词完整作为单个term匹配,限制更严格。
问题2:自定义排序后min_score失效的解决方案
ES默认开启自定义sort排序时,不会计算文档相关性得分,因此_score字段为null,min_score规则自然无法生效。
修改方案:在查询根参数中新增track_scores: true,强制ES即使配置了自定义排序也会计算相关性得分,min_score规则就可以正常生效。修改后的完整查询配置如下:
"query": { "bool": { "must": [ { "bool": { "should": [ { "match": { "search_by": { "query": "abcd" } } } ] } } ], "must_not": [], "should": [] } }, "min_score": 2, "track_scores": true, // 新增配置,强制计算相关性得分 "from": 0, "size": 24, "sort": [ { "order_by": "desc" } ]
两种修改方案可以同时生效,既可以避免返回无关前缀的结果,也能在自定义排序场景下正常通过min_score过滤低得分文档。
内容的提问来源于stack exchange,提问作者user88831
相关产品推荐
相关产品推荐

