使用unique过滤器时Elasticsearch评分异常问题求助
使用unique token filter后评分仍受重复token影响的问题
我在Elasticsearch分析器中使用unique token filter时,发现文档评分仍会被重复token影响。
分析器配置
{ "settings": { "analysis": { "analyzer": { "tnved_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "stemmer", "unique" ] } } } }, "mappings": { "properties": { "NAME": { "type": "text", "analyzer": "tnved_analyzer" }, "CODE": { "type": "keyword" } } } }
查询请求(完全匹配)
{ "query": { "match_phrase": { "NAME": "Pork fresh or chilled" } } }
查询响应
{ "took": 0, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 14.432465, "hits": [ { "_index": "tnved14_code", "_type": "_doc", "_id": "1oajS4cBEkrkvkWeGRXx", "_score": 14.432465, "_source": { "CODE": "0203", "NAME": "Pork fresh or chilled" } } ] } }
完全匹配时得分为14.432465。当查询语句改为**"Pork fresh or chilled Pork fresh or chilled"**时,我预期分词后得到的token和原查询一致(pork、fresh、or、chilled),得分应该相同,但实际得分翻倍为28.864931。我需要让重复查询的得分保持为14.432465,请问问题出在哪里?
问题原因
unique token filter仅在索引阶段生效,它的作用是去除文档索引时生成的重复token,但不会干预查询阶段的分词处理。当你传入重复的查询文本时,查询默认的分词逻辑不会自动去重,会生成两倍数量的token序列,而match_phrase查询的评分会结合查询词的token数量、匹配位置等因素计算,最终导致得分翻倍。
解决方案
方案1:查询阶段也应用去重分析器
修改查询请求,指定使用你定义的tnved_analyzer,让查询文本先经过分析器去重后再执行匹配,这样生成的token序列和原查询一致,得分就会相同:
{ "query": { "match_phrase": { "NAME": { "query": "Pork fresh or chilled Pork fresh or chilled", "analyzer": "tnved_analyzer" } } } }
方案2:强制固定评分(适合无需区分匹配度的场景)
使用constant_score查询包裹match_phrase,直接指定固定得分,忽略查询词的重复影响:
{ "query": { "constant_score": { "filter": { "match_phrase": { "NAME": "Pork fresh or chilled Pork fresh or chilled" } }, "boost": 14.432465 } } }
内容的提问来源于stack exchange,提问作者KseniaT
相关产品推荐
相关产品推荐

