【问题标题】:How to make a full text-query on date attribute in Elastic Search如何在 Elastic Search 中对日期属性进行全文查询
【发布时间】:2018-11-03 22:38:36
【问题描述】:

我有一个带有日期类型属性的文档(如下所示)

{
  "releaseDate": {
   "time": "1990-02-01T00:00:00+0000",
  }
}

我有信心做一些范围查询(日期数学等),所以如果我要查找 1990 年的所有事件,我可以进行以下范围查询

{
  "query": {
    "range": {
      "releaseDate.time": {
        "gte": "1990",
        "lte": "1991"
      }
    }
  }
}

我注意到弹性搜索允许在日期上进行全文搜索(匹配)

匹配查询接受文本/数字/日期,分析它们,并构造一个查询。例如: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html

但我无法理解如何进行正确的查询。

例如,如果我搜索以下匹配查询

{
  "query": {
    "match": {
      "attribute.releaseDate.time": "1990"
    }
  }
}

即使日期 1990-02-01T00:00:00 存在,ES 也会返回零结果

但是如果我做了以下

{
  "query": {
    "match": {
      "attribute.releaseDate.time": "1990-02"
    }
  }
}

我找到了我的活动。


我的理解是,对于搜索查询,ES 会将我的搜索扩展为 1990-01-01T00:00:00+0000,这与 1990-02-01T00:00:00+0000 的索引值不匹配,而在第二个查询中,令牌是相同的。

这将导致我的问题:

有什么方法可以使用以下查询? - 事件发生在 1990 年,日期包含 1990 年(没有范围) - 事件发生在任何一年的二月 - 事件发生在每年的 5 月 2 日

但我还没有找到任何可行的例子(我发现的唯一的东西就是https://discuss.elastic.co/t/mapping-date-field-as-multifiled-to-provide-date-query-and-full-text-search/80691

【问题讨论】:

  • 您是否考虑过将年份明确索引为一个单独的字段?

标签: date elasticsearch elasticsearch-5


【解决方案1】:

很遗憾,您不能这样做。如果要按年份搜索,则必须使用范围查询和rounding

例如,在您的情况下,您可以使用下一个查询:

{
    "query": {
        "range" : {
            "age" : {
                "gte" : "1990||/y",
                "lte" :  "1990||/y"
            }
        }
    }
}

【讨论】:

  • 今年用例很清楚,我发现一个想法是使用多字段
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多