您的位置:首页 > 其它

ES 基本使用《二》--组合过滤

2017-10-19 17:02 225 查看
1.组合过滤器

 在实际应用中,我们很有可能会过滤多个值或字段。比方说,怎样用
Elasticsearch 来表达下面的 SQL ? SELECT product
FROM products
WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3")
AND (price != 30)
这种情况下,我们需要 
bool
 (布尔)过滤器。 这是个 复合过滤器(compound
filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。

布尔过滤器组成:

{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}

must
所有的语句都 必须(must) 匹配,与 
AND
 等价。
must_not
所有的语句都 不能(must not) 匹配,与 
NOT
 等价。
should
至少有一个语句要匹配,与 
OR
 等价。

就这么简单! 当我们需要多个过滤器时,只须将它们置入 
bool
 过滤器的不同部分即可。

注意:官方文档有点问题,在5.X后,filtered 被bool代替了,The 
filtered
 query
is replaced by the bool query。

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-filtered-query.html
GET /my_store/products/_search
{
"query" : {
"bool": {
"should": [
{"term": {"price":20}},
{"term": { "productID": "XHDK-A-1293-#fJ3"}}
],
"must_not": [
{"term": {
"price": {
"value": "30"
}
}}
]
}
}

}


嵌套bool过滤器
对于以下SQL:

SELECT document
FROM products
WHERE productID = "KDKE-B-9947-#kL5"
OR ( productID = "JODL-X-1937-#pV7"
AND price = 30 )DSL 如下:
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}}
]}}

]
}
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ES 索引 组合过滤