弹性搜索:允许/查找缺少嵌套字段/空数组的对象?

时间:2016-11-24 23:51:56

标签: elasticsearch

我试图使用2个bool应该一起过滤:一个返回包含日期范围内任何event_dates.starts_at值的对象,例如:

"event_dates": [
   {
      "starts_at": "2016-12-04T08:00:00+07:00"
   },
   {
      "starts_at": "2016-12-11T08:00:00+07:00"
   }
]

(单独工作),另一个允许同时不包含event_dates.starts_at个字段的对象,例如:

"event_dates": []

(使用缺少的查询,但似乎取消了第一个过滤器的效果,只返回我数据库中的所有内容)

下面是我到目前为止的查询:

{  
   "query":{  
      "filtered":{  
         "filter":{  
            "and":[  
               {  
                  "bool":{  
                     "should":[  
                        {  
                           "nested":{  
                              "path":"event_dates",
                              "filter":{  
                                 "range":{  
                                    "event_dates.starts_at":{  
                                       "gte":"20161125",
                                       "lte":null,
                                       "format":"basic_date"
                                    }
                                 }
                              }
                           }
                        },
                        {  
                           "missing":{  
                              "field":"event_dates.starts_at"
                           }
                        }
                     ]
                  }
               }
            ]
         }
      }
   }
}

(因为我从较大的查询中提取了这个,所以可能会有一些不必要的位)。有谁知道我在哪里出错?尝试将缺失的过滤器指定为嵌套路径,但无法使其工作...

1 个答案:

答案 0 :(得分:0)

试试这个:

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "nested": {
              "path": "event_dates",
              "filter": {
                "bool": {
                  "should": [
                    {
                      "range": {
                        "event_dates.starts_at": {
                          "gte": "20161125",
                          "lte": null,
                          "format": "basic_date"
                        }
                      }
                    },
                    {
                      "missing": {
                        "field": "event_dates.starts_at"
                      }
                    }
                  ]
                }
              }
            }
          }
        ]
      }
    }
  }
}