首页 > 解决方案 > Elasticsearch 日期范围问题

问题描述

我正在学习 Elasticsearch,但对日期范围查询有疑问。我的查询只比较日期,而不是整个日期。这是一个简短的示例:

DELETE test

PUT /test
{
  "mappings": {
      "properties": {
        "date" : {
          "type": "date",
          "format": "dd MM YYYY"
        }
      }

  }
}

POST /_bulk
{"index" : {"_index": "test"}}
{"date": "01 01 2001"}

POST /test/_search
{
  "query": {
    "range": {
      "date": {
        "lt": "01 01 2016",
        "gt": "01 01 2000"
      }
    }
  }
}

POST /test/_search
{
  "query": {
    "range": {
      "date": {
        "lte": "01 01 2000",
        "gte": "01 01 2016"
      }
    }
  }
}

据我了解,第一个搜索查询应该返回文档 - 日期 2001 是 < 2016 和 > 2000。第二个查询应该什么都不返回,因为 2001 不是 <= 2000 和 >=2016。但它的作用完全相反。

你能指出我缺少什么吗?

标签: elasticsearch

解决方案


它失败的原因是因为 ES 没有正确格式化您的日期。日期格式化行为在 6.x 和 7.0 之间发生了变化,并且基于 joda 的日期格式化程序被替换为 java 的。如果您将格式更改为"format": "dd MM yyyy"(注意小写yyyy),您会发现您的搜索有效。

格式不起作用的原因是YYYY表示date week year。您几乎总是希望在日期格式中使用小写yyyy格式来表示您的年份。


推荐阅读