布尔过滤器
实际工作中,我们需要ES帮助我们完成组合查询,类似于下面的SQL语句
SELECT product
FROM products
WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3")
AND (price != 30)
这些情况下,你需要 bool 过滤器。这是以其他过滤器作为参数的组合过滤器,将它们结合成多种布尔组合。
【布尔过滤器】
bool 过滤器由三部分组成:
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}
must:所有分句都必须匹配,与 AND 相同
must_not:所有分句都必须不匹配,与 NOT 相同
should:至少有一个分句匹配,与 OR 相同
bool 过滤器的每个部分都是可选的(例如,你可以只保留一个 must 分句),而且每个部分可以包含一到多个过滤器
示例
查询数据库中价格为20或者ID为XXX的数据,并且价格不等于30
SELECT product
FROM products
WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3")
AND (price != 30)
GET /my_store/products/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"price": 20
}
},
{
"term": {
"productID": "XHDK-A-1293-#fJ3"
}
}
],
"must_not": [
{
"term": {
"'price": 30
}
}
]
}
}
}
嵌套布尔过滤器
虽然 bool 是一个组合过滤器而且接受子过滤器,需明白它自己仍然只是一个过滤器。这意味着你可以在 bool 过滤器中嵌套 bool 过滤器,让你实现更复杂的布尔逻辑。
SELECT document
FROM products
WHERE productID = "KDKE-B-9947-#kL5"
OR ( productID = "JODL-X-1937-#pV7"
AND price = 30 )
GET /my_store/products/_search
{
"query": {
"bool": {
"should": [
{ "term":{"productID": "KDKE-B-9947-#kL5"}},
{
"bool": {
"must": [
{"term": { "productID": "JODL-X-1937-#pV7" }},
{"term": { "price": 30 }}
]
}
}
]
}
}
}
1、 productID 匹配第一个 bool 中的 term 过滤器。
2、 这两个字段匹配嵌套的 bool 中的 term 过滤器。