【问题标题】:Can Elasticsearch filter by a date range without specifying a field?Elasticsearch 可以在不指定字段的情况下按日期范围过滤吗?
【发布时间】:2016-07-13 19:35:59
【问题描述】:

我有多个日期字段,我希望有一个日期范围查询来按任何个字段进行过滤。

例如,我的索引中可能有书籍,每本书可能有一个出版日期出版日期印刷日期,以及作者的出生日期

映射很简单(使用Elasticsearch.net Nest 生成):

"printDate" : {
    "type" : "date",
    "format" : "strict_date_optional_time||epoch_millis"
},

我查看了 range queriesquery string ranges - 两者都需要明确的字段名称并且似乎不支持通配符。
例如,这找不到任何东西,但如果我使用真实的字段名称而不是 "*Date",则可以:

"filter": [
  {
    "range": {
      "*Date": {
        "gte": "2010-01-01T00:00:00",
        "lte": "2015-01-01T00:00:00"
      }
    }
  }
]

我还尝试将 [2010-01-01 TO 2015-01-01] 放在查询字符串中,但日期解析不正确 - 它还会发现 201001 作为其他字符串(以及看似其他日期)的一部分。
另一种选择是在"should" 子句下列出每个字段并指定"minimum_should_match":1,但这将使我维护所有日期字段的列表,这似乎不雅。

有没有办法在所有日期字段中搜索日期范围?

【问题讨论】:

  • 我会选择支持通配符字段名称的query_string
  • 此外,例如,ES 不会神奇地选择仅属于 date 类型的字段。你需要帮助它一点。通过对日期字段使用相似的名称,然后对字段名称使用通配符等。
  • @AndreiStefan - 我尝试了查询字符串和通配符,但它不解析日期,而是寻找字符串。
  • 好的。您可以分享您尝试过但失败的查询吗?另外,请提供查询中使用的那些字段的映射。
  • @AndreiStefan - 当然,就在这里。当然,这可能不受支持。如果 *Date 可以工作,它会解决我的问题 - 只是所有这些字段都以 Date 结尾。

标签: elasticsearch elasticsearch-query


【解决方案1】:

试试这个查询:

{
  "query": {
    "query_string": {
      "default_field": "*Date", 
      "query": "[2010-01-01T00:00:00 TO 2015-01-01T00:00:00]"
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多