我有一个看起来像这样的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
属性,但这似乎无济于事。
任何人都可以阐明我该如何解决吗?
答案 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)
答案 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