Bool query 对应lucene 的BooleanQuery
,一般由一个或者多个查询子句组成,如下表格所示:
用法 | 描述 |
---|---|
must | 查询一定包含匹配查询内容,并且提供得分 |
filter | 查询一定包含匹配查询内容,但是不提供得分,会对查询结果进行缓存 |
should | 子查询不一定包含查询内容 |
must_not | 查询一定不包含查询内容,来自于filter 上下文,所以不会由评分,但是会缓存 |
bool 查询秉持匹配越多越接近的原则,每个子查询(must or should)评分会被加在一起作为最终评分。
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参数指定返回的文档必须匹配的子句的数量或百分比。
如果bool 查询包含至少一个should 子查询并且没有must 或者filter 查询,则默认数值是1.否则默认为0.
bool.filter评分
filter 对评分无影响返回值为0,评分只受到特殊查询影响,比如,如下三种情况的得分
使用filter,返回的文档得分都为0:
GET _search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
使用match_all查询,所有文档评分都为1.0
GET _search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
constant_score 查询与match_all 完全一致,使用filter 返回所有文档都分配一个1.0 的评分
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
每个查询在顶部的定义里面都要接收一个_name 。可以使用这种查询追踪匹配返回的文档。比如,返回命中文档必须包含一个match 查询的属性:
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "name.first": { "query": "shay", "_name": "first" } } },
{ "match": { "name.last": { "query": "banon", "_name": "last" } } }
],
"filter": {
"terms": {
"name.last": [ "banon", "kimchy" ],
"_name": "test"
}
}
}
}
}