must,must_not,should
关于bool query:
- Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型。
occurrence | 描述 |
---|---|
must | 返回的文档必须满足must子句的条件,并且参与计算分值 |
filter | 【filter以前时单独的query DSL,现在归入bool query】;子句(查询)必须出现在匹配的文档中。然而,不同于must查询的是——它不参与分数计算。 Filter子句在过滤器上下文(filter context)中执行,这意味着score被忽略并且子句可缓存【所以filter可能更快】 |
should | “权限”比must/filter低。如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句。 |
must_not | 返回的文档必须不满足must_not定义的条件 |
must
bank数据中,找出年龄必须为22,且在Waverly城市的文档
# must
POST /bank/account/_search?pretty
{
"query": {
"bool": {
"must": [
{
"match": {
"age": "22"
}},
{
"match": {
"city": "Waverly"
}}
]
}
}
}
filter
对多个字段filter时,range报错:
[range] query doesn’t support multiple fields, found [balance] and [age]”
非bool query的查询也是同样,不允许多字段
也不允许多个filter存在
因为我想查找多个range,所以terms不适用
但是kibana中试了下,是可以的
# filter
GET /bank/_search?pretty
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
多range已经解决,见更正1
should
找出地址包含”mill”或者”lane”的文档
- “minimum_should_match” : 2
表示3个条件至少符合两个 - 如果想知道到底是bool里面哪个条件匹配,可以使用named查询【给每个查询取个名字,使用”_name”参数】
比如:”match”: { “address”:{ “query”:”mill”, “_name”:”first” } }
# should
GET /bank/_search?pretty
{
"query": {
"bool": {
"should": [
{ "match": { "address":{ "query":"mill", "_name":"first" } }},
{ "match": { "addre