【问题标题】:Having ElasticSearch ignore filter when field does not exist当字段不存在时让 ElasticSearch 忽略过滤器
【发布时间】:2015-12-01 00:43:53
【问题描述】:

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

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

ElasticSearch 正在过滤所有具有通道 24 的文档,但我还想要所有其他没有属性通道的文档。例如,我的查询应该包含所有演员(doc 没有属性 channel 和 startTime)、电影(doc 没有属性 channel 和 startTime)、流派(doc 没有属性 channel 和 startTime)和电视节目/节目(doc 有属性 channel和 startTime)在第 24 频道播出。

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

谢谢 蒂亚戈

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 嗨@Sloan,它没有用。我对包含电视节目/节目的索引运行了过滤器,但没有返回任何文档。
    • 除非您能提供一些示例数据,否则很难诊断出问题。理想情况下,数据应该被简化以保留问题的本质,但不会充满无关紧要的东西,并且仍然有足够的变化以明确您期望返回什么以及不希望返回什么。你可能想把它放在一个要点或其他东西中。
    • 如果你能提供已经打包成批量请求的数据(比如this),那就更好了。
    • 让我准备要点并发送给您!谢谢
    猜你喜欢
    • 2021-09-10
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多