在我的es数据中,有 nested
以及 parent
日期字段。我需要把这些日期用在一个无痛剧本里。这是容易操作的 parent
日期被视为 time object
. 例如,转换 parent
日期 doc['validFrom']
到我刚才使用的unix时间:
doc['validFrom'].value.millis
但这是一个不同的情况下与操作 nested
像这样的日期 params._source['offers'][0].validFrom
. 这些日期作为 String
,不是 date
. 所以我必须把它们解析成 date
手动对象:
LocalDateTime.parse(params._source['offers'][0].validFrom), ZoneId.systemDefault()).toInstant().toEpochMilli()
这种手动日期解析给脚本带来了额外的复杂性。在我看来,这也不利于表现。可以吗 nested date field
作为一个 date object
在elasticsearch脚本中直接执行而不从字符串解析?
p、 s数据示例:
[
{
"id": "1",
"rank": 8,
"validFrom": "1970-01-01T00:00:00"
"offers": [
{
"id": "777",
"rank": 12,
"validFrom": "2020-07-06T00:00:00" // !!! should take the date from here
}
]
},
{
"id": "2",
"rank": 35,
"validFrom": "2019-05-03T00:00:00" // !!! should take the date from here as offers are null
"offers": null
}
]
我的剧本
"sort": [
{
"_script": {
"script": {
"source": "params._source.offers != null ? ZonedDateTime.of(LocalDateTime.parse(params._source['offers'][0].validFrom), ZoneId.systemDefault()).toInstant().toEpochMilli() : doc['validFrom'].value.millis",
"lang": "painless"
},
"type": "number",
"order": "asc"
}
}
]
1条答案
按热度按时间h7wcgrx31#
这个问题和这个有关。
这里的主题是区分
doc_values
以及_source
领域。自
doc_values
如果返回基元类型,则可以访问.millis
在日期字段。但是_source
它本身是一个json格式的、未经分析的Map,所以很遗憾,您只能得到最初摄取的内容。当您在性能方面遇到问题时,我建议您提取嵌套的
validFrom
到最高层打电话,比如说,validFromOverride
. 排序脚本的逻辑复杂性将大大降低。Map和文档结构不需要是不变的。