Elasticsearch如何配置bool查询仅返回should子句得分最高的匹配结果
问题原因
当前查询返回全部3条type=mammal的文档,是因为ES的bool查询默认规则:只要must子句全部命中,文档就会进入结果集,should子句仅用于计算相关性得分,不参与结果过滤。
你当前的3条测试数据的body字段都包含fast,全部命中should下的match_phrase_prefix条件,所以都会被返回,仅得分有差异:Fast dog完全匹配title的dog关键字得分最高,Fast doggg模糊匹配得分次之,Fast cat仅命中body条件得分最低。
调整方案
只需做两处简单调整即可实现需求:
- 给
bool查询增加minimum_should_match: 1配置,保证只有至少命中一个should子句的文档才会进入结果集,过滤掉仅匹配must的无效文档。 - 在查询根层级增加
size: 1配置,ES默认按相关性得分降序排序,返回的第一条就是should子句匹配得分最高的Fast dog记录。
调整后的完整搜索模板如下:
{ "source": { "size": 1, "query": { "bool": { "must": [ { "match": { "type": { "query": "{{type}}" } } } ], "minimum_should_match": 1, "should": [ { "match": { "title": { "query": "{{animal}}", "fuzziness": 2 } } }, { "match_phrase_prefix": { "body": "{{personality}}" } } ] } } }, "params": { "animal": "dog", "personality": "fast", "type": "mammal" } }
如果你不想修改source的固定结构,也可以直接在请求路径上加参数实现同样效果:
GET animals/_search/template?size=1
内容的提问来源于stack exchange,提问作者Pants
相关产品推荐
相关产品推荐

