Elasticsearch中must、should、excludeFilters详解及所属查询类型问询
Elasticsearch bool查询三类子句说明
三者是否属于bool查询的组成部分?
首先给出明确结论:must、should本身就是Elasticsearch复合查询分类下bool查询的官方原生子句,你提到的excludeFilters是开发者对bool查询中must_not排除子句的常用俗称,三者完全属于bool查询的核心组成部分。
三类子句的功能与适用场景
must子句
- 功能:强制匹配子句,所有配置的查询条件必须全部满足,才会返回对应文档。默认处于查询上下文,会计算每个条件的匹配度,累加生成文档的相关性得分,得分越高排序越靠前。如果放到
filter上下文下,会关闭得分计算,仅做条件过滤。 - 适用场景:核心匹配条件必须命中的场景,比如商品搜索时要求「商品处于上架状态」「类目归属数码3C」这类基础必选条件,同时需要按匹配度做排序的场景。
should子句
- 功能:可选匹配子句,不需要满足所有配置的条件,命中的子句数量越多,文档的相关性得分越高。如果当前bool查询下没有同级的
must/filter子句,默认要求至少命中1个should条件才会返回文档,也可以通过minimum_should_match参数自定义需要命中的子句数量/比例。 - 适用场景:多维度加权匹配的场景,比如搜索「笔记本电脑」时,标题命中加高分、商品描述命中加次高的分、商品标签命中额外加分,通过匹配度加权让更符合用户需求的文档排在前面。
- 注意:如果bool查询中同时存在同级的must/filter子句,should子句默认没有最低命中要求,仅用于提升匹配文档的相关性得分。
excludeFilters(对应must_not子句)
- 功能:排除匹配子句,所有配置的条件必须全部不满足,才会返回对应文档。默认处于过滤上下文,完全不计算相关性得分,仅做内容剔除,匹配结果会自动缓存,性能极高。
- 适用场景:需要剔除特定范围内容的场景,比如商品搜索时排除「库存为0」「已下架」「归属二手类目」的商品,或者内容检索时屏蔽违规、黑名单用户发布的内容。
核心使用差异对比
- 匹配逻辑差异:
must要求所有条件全部命中,should支持可选命中,excludeFilters要求所有条件全部不命中 - 得分逻辑差异:默认
must、should会参与相关性得分计算,excludeFilters完全不参与得分;如果把must放到filter上下文,也可以关闭得分计算,仅做过滤 - 性能差异:
excludeFilters和filter上下文下的must性能最高,结果支持全局缓存;需要计算得分的must、should因为要做匹配度加权计算,性能略低 - 执行优先级差异:
excludeFilters优先级最高,只要命中排除条件的文档会直接被剔除,不会参与后续的匹配和得分计算
简单使用示例
{ "query": { "bool": { "must": [ { "term": { "status": "online" } }, { "match": { "title": "笔记本电脑" } } ], "should": [ { "match": { "desc": "轻薄便携" } }, { "term": { "tag": "2024新品" } } ], "must_not": [ { "term": { "stock": 0 } }, { "term": { "category": "二手商品" } } ], "minimum_should_match": 1 } } }
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

