Elasticsearch如何优化match_phrase查询让无前后多余词的结果优先
Elasticsearch 短语匹配权重优化方案
先修正原查询的拼写错误
原查询中将match_phrase误写为match_pharse,会直接导致查询报错,需要先修正该拼写问题。
实现逻辑
要实现「完全匹配短语的结果排最前,包含短语的结果排其后」的排序效果,bool查询的逻辑如下:
must子句保留match_phrase查询,确保所有返回结果都包含连续的brown fox短语,过滤完全不相关的结果should子句新增完全匹配的加权规则:针对title字段的keyword子字段(默认不分词,存储原始文本)做等值匹配,给命中的文档加更高权重,拉高其总得分
完整查询代码
GET /myindex/_search { "query": { "bool": { "must": [ { "match_phrase": { "title": "brown fox" } } ], "should": [ { "term": { "title.keyword": { "value": "brown fox", "boost": 10, "case_insensitive": true } } } ] } } }
参数说明
boost: 10:给完全匹配的文档额外加10倍权重,数值可根据实际排序效果调整,数值越大完全匹配的结果排序越靠前case_insensitive: true:忽略大小写匹配,ES 7.10及以上版本支持,如果你的ES版本低于该要求,可以将keyword字段的normalizer配置为小写规范化,实现相同效果- 若title字段未配置keyword子字段,也可以在should子句中使用
match_phrase配合boost做短语匹配,仅精准度略低于keyword字段的等值匹配
结果验证
针对你提供的示例数据,查询返回结果顺序为:
{"title":"brown Fox"}:命中should子句,得分最高,排第一位{"title":"It's brown fox"}:仅命中must子句,得分次之,排第二位
其余不包含brown fox连续短语的文档不会被返回,完全符合预期。
内容的提问来源于stack exchange,提问作者hamid reza
相关产品推荐
相关产品推荐

