首页 > 解决方案 > 如何正确设置日期和时间的映射以及如何在 ElasticSearch 中过滤它们?

问题描述

搜索日期不会返回真正必须的文档。没有错误信息。

下面是三个json:mapping、request和第一个找到的doc

{
  "hello_world_schedule_fields": {
    "mappings": {
      "properties": {
        "date": {
          "type": "date",
          "format": "YYYY-MM-DD"
        },
        "datetime": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "id": {
          "type": "long"
        },
        "is_free": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "price": {
          "type": "long"
        },
        "quest_id": {
          "type": "long"
        },
        "time": {
          "type": "date",
          "format": "HH:mm"
        }
      }
    }
  }
}
{
  "query":{
    "bool":{
      "filter":{
        "term":{
          "quest_id":722
        }
      },
      "must":{
        "range":{
          "date":{
            "lte":"2019-06-01"
          }
        }
      }
    }
  },
  "from":0,
  "size":9999
}
{
  "id":4836777,
  "quest_id":722,
  "datetime":"2019-06-24 10:15",
  "price":400,
  "is_free":"true",
  "created_at":null,
  "updated_at":null,
  "date":"2019-06-24",
  "time":"10:15"
}

所有找到的文档都有 quest_id: 722 但日期是错误的。我的索引中的最小现有日期是 2019-06-24,但我想搜索小于 2019-06-01 的日期,所以应该找不到任何东西。

标签: elasticsearch

解决方案


您的日期格式错误:应该是yyyy-MM-dd(即小写yd

  • D(大写 D)是一年中的一天(不是一个月中的一天)
  • Y(大写 Y)是基于周的年份(不是年份)

推荐阅读