本地英文版地址: ../en/query-dsl-bool-query.html
匹配与其他查询的布尔(bool)组合相匹配的文档的查询。
bool 查询映射到 Lucene 的 BooleanQuery。
它使用一个或多个布尔子句构建,每个子句都有一个类型的出现。
出现的类型包括:
| 出现 | 描述 |
|---|---|
|
该子句(查询)必须出现在匹配的文档中,并且将参与计算得分。 |
|
该子句(查询)必须出现在匹配的文档中。
然而,与 |
|
该子句(查询) 应该(should) 出现在匹配的文档中。 |
|
该子句(查询)不能出现在匹配的文档中。
该子句在 filter 的上下文中执行,这意味着该字句的评分会被忽略,但会考虑对该字句进行缓存。
因为评分被忽略,所以所有文档都返回 |
bool 查询采用越匹配越好(more-matches-is-better)的方法,因此每个匹配的 must 或 should 子句的分数将被加在一起,以提供每个文档的最终的_score。
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tag" : "wow" } },
{ "term" : { "tag" : "elasticsearch" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
可以使用 minimum_should_match 参数来指定返回文档 必须(must) 匹配的should子句的数量或百分比。
如果 bool 查询至少包含一个 should 子句,并且没有 must 或 filter 子句,则默认值为 1。
否则,默认值为 0。
关于其他可用的值, 参考 minimum_should_match 参数。
filter 元素下指定的查询对评分没有影响,因为返回的分数都是 0。
分数只受已指定的查询的影响。
例如,以下三个查询都返回 status 字段包含词项 active 的所有文档。
第一个查询为所有文档分配 0 分,因为没有指定计分的查询:
GET _search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
下面这个 bool 查询有一个 match_all 查询,它给所有文档分配 1.0 分。
GET _search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
第三个例子, 下面这个 constant_score 查询的行为与上面的第二个示例完全相同。constant_score 查询将分数 1.0 分配给与过滤器匹配的所有文档。
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
如果需要知道 bool 查询中的哪个子句与查询返回的文档相匹配,可以使用 命名查询(named queries) 为每个子句指定一个名称。