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

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

ElasticSearch正在过滤所有具有通道24的文档,但是我也希望所有其他没有属性通道的文档。例如,我的查询应包含所有 Actor (文档不具有属性channel和startTime),电影(文档不具有属性channel和startTime),流派(文档不具有属性channel和startTime)和电视节目/节目(文档具有属性channel和startTime)在第24 channel 播放。

有没有一种方法可以不涉及过滤器脚本?我可以使用脚本来实现这一点,但是查询的性能确实很差。

谢谢
蒂亚戈

最佳答案

试试这个:

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"
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

关于elasticsearch - 当字段不存在时让ElasticSearch忽略过滤器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34002491/

10-17 03:14