bool查询不支持过​​滤器

use*_*562 2 elasticsearch-2.0

这是使用ES 2.0引发异常的查询:

bool query does not support filter
Run Code Online (Sandbox Code Playgroud)

如何使用“存在和缺失”查询?

查询:

{
   "bool":{
      "must":[
         {
            "bool":{
               "should":[
                  {
                     "bool":{
                        "must":[
                           {
                              "range":{
                                 "startDate":{
                                    "lte":"2016-10-27T11:24:49.6616538+05:30"
                                 }
                              }
                           }
                        ],
                        "filter":[
                           {
                              "bool":{
                                 "must_not":[
                                    {
                                       "exists":{
                                          "field":"endDate"
                                       }
                                    }
                                 ]
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

首先,该错误通常是由于在Elasticsearch 1.x版本上使用。(在这种情况下,您需要FilteredQuery

接下来,您似乎有许多不必要的嵌套层次。不知道也许您是否剥离了其他内容以使示例更简单。我已经像这样重写了您的查询(并添加了大括号):

{
    "query" : {
        "bool" : {
            "must" : [{
                    "range" : {
                        "startDate" : { "lte" : "2016-10-27T11:24:49.6616538+05:30" }
                    }
                }
            ],
            "filter" : [{
                    "bool" : {
                        "must_not" : [{
                                "exists" : { "field" : "endDate"    }
                            }
                        ]
                    }
                }
            ]} } 
}
Run Code Online (Sandbox Code Playgroud)

您的原始查询和我重写的查询都可以在我的服务器(v2.3.1)上正常工作,因此我猜测您确实拥有ES 1.x?

另外,如果您不利用Lucene评分,而只想返回文档(或应用您自己的排序),则可以完全删除过滤器并进一步简化它:

{
    "query" : {
        "bool" : {
            "must" : [{
                    "range" : {
                        "startDate" : { "lte" : "2016-10-27T11:24:49.6616538+05:30"}
                    }
                }
            ],
            "must_not" : [{
                    "exists" : { "field" : "endDate"    }
                }
            ]} } 
}
Run Code Online (Sandbox Code Playgroud)