嵌套在过滤器elasticsearch中的目的是什么?

时间:2019-07-30 11:00:25

标签: elasticsearch

以下es过滤查询之间有什么区别? 1.为多种查询条件过滤上下文:

hash[key] << value
  1. 必须在过滤器上下文中:
{
"query": {
    "bool": {
        "filter": [
            { "term":  { "status": "published" }}, 
            { "range": { "publish_date": { "gte": "2015-01-01" }}} 
        ]
    }
  }
}

1 个答案:

答案 0 :(得分:0)

第一个查询用于仅在不同字段上使用AND运算符进行过滤的情况。默认情况下,如果您以这种方式编写过滤查询,它将作为AND操作执行。

在您的案例/场景中,第二个查询的功能与第一个查询完全相同(没有区别,只是做同一件事的两种方式), 但是 “还”可以这样做,以实现/覆盖使用许多不同的ANDOR组合的更复杂的过滤器用例。

请注意,在Elasticsearch中, AND must表示,而 OR should子句表示。

比方说,我想过滤一种情况,就像我希望所有文档都具有

  • 101部门或
  • 的销售
  • 部门101B的销售以及价格> 150

您可能最终将不得不通过以下方式编写查询:

POST sometestindex/_search
{  
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "bool":{  
                  "should":[  
                     {  
                        "term":{  
                           "dept.keyword":"101"
                        }
                     },
                     {  
                        "bool":{  
                           "must":[  
                              {  
                                 "term":{  
                                    "dept.keyword":"101B"
                                 }
                              },
                              {  
                                 "range":{  
                                    "price":{  
                                       "gte":150
                                    }
                                 }
                              }
                           ]
                        }
                     }
                  ],
                  "minimum_should_match": 1
               }
            }
         ]
      }
   }
}

简而言之,对于您的情况,第一个查询只是编写第二个查询的一种简便方法,但是,如果您具有更复杂的过滤器逻辑,则需要在过滤器中利用Bool查询,就像我在示例示例中提到的那样,在您的第二个查询中提到过。

希望如此!