如何避免Elasticsearch模糊搜索时重复词获得过高权重得分
问题原因
ES默认使用BM25算法计算相关性得分,词频(Term Frequency,即搜索词在单篇文档中出现的次数)是核心打分因子之一,出现次数越多得分越高。你遇到的情况就是第二篇文档中query重复出现3次带来的词频加分,超过了第一篇同时命中test和query两个搜索词的基础得分。
解决方案(均保留模糊搜索能力)
方案1:查询时调整BM25的词频饱和度参数k1
k1参数用于控制词频对得分的影响幅度,默认值为1.2,数值越小词频的权重越低,设置为0时词频完全不参与打分。你可以根据业务场景在0~1.2区间调整,示例配置如下:
"query": { "match": { "NAME": { "query": "test query", "fuzziness": "AUTO", "k1": 0.1 } } }
方案2:拆分查询词提升多词命中的优先级
如果希望命中更多搜索词的文档排名始终高于仅命中单个词但重复多次的文档,可以用bool查询拆分每个搜索词为独立的should子句,示例如下:
"query": { "bool": { "should": [ {"match": {"NAME": {"query": "test", "fuzziness": "AUTO", "k1": 0.1}}}, {"match": {"NAME": {"query": "query", "fuzziness": "AUTO", "k1": 0.1}}} ], "minimum_should_match": 1 } }
方案3:索引阶段全局配置字段的词频权重
如果该字段所有查询都需要弱化词频影响,可以在创建索引时直接配置字段的相似算法参数,无需每次查询单独设置:
{ "mappings": { "properties": { "NAME": { "type": "text", "similarity": "custom_bm25" } } }, "settings": { "index": { "similarity": { "custom_bm25": { "type": "BM25", "k1": 0.1 } } } } }
内容的提问来源于stack exchange,提问作者Mohammad Bassam Ibreighith
相关产品推荐
相关产品推荐

