如果字段存在则Elasticsearch查询应用范围

ara*_*ibi 1 elasticsearch elastica

我的索引有一个“valid_until”字段,该字段可以为空或有效的日期时间。我想编写一个查询来从索引中获取所有文档,并仅在“valid_until”具有有效日期时应用范围过滤器。

部分指数数据:

[
   ['name' => 'book1', 'valid_until' => '2019-09-30 18:00:00'],
   ['name' => 'book2', 'valid_until' => ''],
   ['name' => 'book3', 'valid_until' => '2019-09-20 18:00:00'],
], 
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "valid_until": {
              "gte": "2019-09-22 00:00:00"
            }
          }
        },
        {
          "bool": {
            "must_not": {
              "exists": {
                "field": "valid_until"
              }
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

ara*_*ibi 5

如果将来有人需要这个,我就是这样解决的:

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "range": {
                  "valid_until": {
                    "gte": "now"
                  }
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "valid_until"
                    }
                  }
                }
              }
            ]
          }
        }
      ],
      "must_not": [],
      "should": [],
      "must": []
    }
  }
}
Run Code Online (Sandbox Code Playgroud)