Elasticsearch的search_after不适用于日期

时间:2018-10-31 08:37:11

标签: elasticsearch

我有一个看起来像这样的Elasticsearch查询,

{
  size: 25,
  query: {
    bool: {
      filter: ...,
      must: ...
    }
  },
  sort: [
    {
      created_at: {
        order: "desc
      }
    },
    {
      id: {
        order: "desc"
      }
    }
  ],
  from: 0,
  search_after: ["2018-10-25T18:04:13.488Z", "8"]
}

运行此程序时,我收到一条错误消息,

  

“原因”:无法解析字段[created_at]的search_after值,   cause_by“:{” type“:” number_format_exception“,” reason“:”用于输入   字符串:\“ 2018-10-23T21:41:03.167Z \”

我尝试用created_at类型和date格式映射date_time属性,但这似乎无济于事。

任何人都可以阐明我该如何解决吗?

3 个答案:

答案 0 :(得分:1)

您需要将日期传递为自纪元以来的毫秒数,即代替2018-10-25T18:04:13.488Z尝试传递1540491254488

{
  size: 25,
  query: {
    bool: {
      filter: ...,
      must: ...
    }
  },
  sort: [
    {
      created_at: {
        order: "desc
      }
    },
    {
      id: {
        order: "desc"
      }
    }
  ],
  from: 0,
  search_after: [1540491254488, "8"]
                       ^
                       |
                  change this

请注意,您可以像现在一样继续为文档建立索引,但是在创建查询时,您需要将该编号输入search_after

答案 1 :(得分:0)

此外,Elasticsearch文档对此具有误导性,因为其example看起来像:

item_ID

使您相信距该纪元以来是秒,而不是毫秒。

答案 2 :(得分:0)

对日期字段进行排序时,Elastic Search 将始终返回 sort 中的 epoch_millis 值,即使您在映射中定义了不同的格式。

文档中对此进行了解释here

“请注意,返回的排序值都是以毫秒为单位的,自纪元以来。”

因此,如果您定义了不同的格式并依赖 sort 实现分页,则需要将 epoch_millis 转换为您想要的格式。解决此问题的最简单方法可能是在日期映射格式中包含 epoch_millis,即:

  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "strict_date_optional_time||epoch_millis"
      }
    }
  }

参考docs