当字段不存在时,让ElasticSearch忽略过滤器

时间:2015-11-30 15:48:32

标签: elasticsearch

我正在针对当前指向十几个索引的别名运行查询。并非所有文档在这些索引中都具有相同的结构,因此我尝试运行筛选的查询:

     "filter" : {
        "bool" : {
          "must" : [ { 
              "term" : { "channel" : "24" }
            },
            {
              "range" : {
                "startTime" : { "gt" : "now" }
              }
           }]
       }
     }

ElasticSearch正在过滤所有包含24频道的文档,但我还希望所有其他文档都没有属性频道。例如,我的查询应该带来所有演员(doc没有属性channel和startTime),电影(doc没有属性channel和startTime),类型(doc没有属性channel和startTime)和电视节目/节目(doc有属性频道)和startTime)通道24上的空气。

有没有办法在不涉及过滤器脚本的情况下执行此操作?我可以使用脚本来实现这一点但是查询的性能会非常糟糕。

谢谢 蒂亚戈

1 个答案:

答案 0 :(得分:2)

试试这个:

POST /test_index/_search
{
   "filter": {
      "bool": {
         "should": [
            {
               "bool": {
                  "must": [
                     {
                        "term": {
                           "channel": "24"
                        }
                     },
                     {
                        "range": {
                           "startTime": {
                              "gt": "now"
                           }
                        }
                     }
                  ]
               }
            },
            {
               "bool": {
                  "must_not": [
                     {
                        "exists": {
                           "field": "channel"
                        }
                     },
                     {
                        "exists": {
                           "field": "startTime"
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}