bool查询简介
布尔查询允许使用布尔逻辑(AND, OR, NOT)将多个查询子句组合成复杂查询,是Elasticsearch查询DSL的一部分。bool 查询映射到 Lucene BooleanQuery
。它使用一个或多个布尔子句构建,这些布尔子句包括:
布尔子句类型 | 描述 |
---|---|
must | 子句(查询)必须出现在匹配的文档中,并对得分做出贡献。在 must 下定义的每个查询都是逻辑 “AND”,只返回与所有指定查询匹配的文档。 |
must_not | 排除匹配这些子句的文档。子句在filter上下文中执行,不影响评分。由于评分会被忽略,因此所有文档都会返回 0 分。在 must_not 下定义的每个查询都是逻辑 “NOT”,只返回不匹配任何指定查询的文档。 |
should | 子句(查询)应出现在匹配文档中。在 should 下定义的每个查询都起到逻辑 "OR "的作用,返回与任何指定查询匹配的文档。 |
filter | 子句(查询)必须出现在匹配文档中。但与must 不同的是,查询的得分将被忽略。filter子句是在filter上下文中执行的,这意味着评分会被忽略,而结果可以被缓存以提高性能。filter下定义的每个查询都是逻辑 “AND”,只返回与所有指定查询匹配的文档。 |
must 和 should 子句具有逻辑 AND、OR 运算符的功能,有助于对结果进行评分。不过,这些结果不会被缓存以加快检索速度。相比之下,filter 和 must_not 子句用于包含或排除结果,不会影响得分,除非在 constant_score 查询中使用(会缓存结果)。
bool 查询采用 "多多益善 "的方法,因此每个匹配的 must 或 should 子句的得分都会相加,从而得出每个文档的最终 _score 分数。
例子
POST _search
{"query": {"bool" : {"must" : {"term" : { "user.id" : "kimchy" }},"filter": {"term" : { "tags" : "production" }},"must_not" : {"range" : {"age" : { "gte" : 10, "lte" : 20 }}},"should" : [{ "term" : { "tags" : "env1" } },{ "term" : { "tags" : "deployed" } }],"minimum_should_match" : 1,"boost" : 1.0}}
}
minimum_should_match参数
您可以使用 minimum_should_match
参数指定返回文档中必须匹配的 should 子句的数量或百分比。
如果 bool 查询至少包含一个 should
子句,而没有 must
或 filter
子句,则默认值为 1,否则默认值为 0。
类型 | 示例值 | 描述 |
---|---|---|
正整数 | 3 | 表示一个固定值,与should子句的数量无关。 |
负整数 | -2 | 表示should子句总数减去该数字后为必选子句。 |
百分比 | 75% | 表示should子句总数的百分比。根据百分比计算出的数字四舍五入后用作最小值。 |
负百分比 | -25% | 表示可选条款总数的这一百分比可能缺失。从总数中减去该百分比计算出的数字后,再向下取整,以确定最小值。 |
组合 | 3<90% | 一个正整数,后面跟一个小于符号,再后面跟任何一个前面提到的指定符,就是一个条件指定。它表示如果可选条款的数量等于(或小于)该整数,则所有条款都是必需的,但如果大于该整数,则适用该规范。在本例中:如果有 1 到 3 个条款,则所有条款都是必填的,但如果有 4 个或更多条款,则只有 90% 的条款是必填的。 |
多组合 | 2<-25% 9<-3 | 可以用空格分隔多个条件说明,每个条件说明只对大于前一个条件说明的数字有效。在此示例中:如果有 1 或 2 个条款,则两个条款都需要;如果有 3-9 个条款,则除 25% 外所有条款都需要;如果有超过 9 个条款,则除 3 个条款外所有条款都需要。 |