Elasticsearch 脚本:可以将嵌套日期作为日期对象直接访问吗?
Elasticsearch script: can a nested date be accessed directly as a date object?
在我的 ES 数据中,有 nested
和 parent
日期字段。我需要在一个 ES 无痛脚本中使用这些日期。使用 parent
日期很容易操作,因为它被视为 time object
。例如,要将 parent
日期 doc['validFrom']
转换为 UNIX 时间数字,我只使用:
doc['validFrom'].value.millis
但是对于像 params._source['offers'][0].validFrom
这样的 nested
日期操作是不同的情况。这些日期返回为 String
,而不是 date
。所以我必须手动将它们解析为 date
对象:
LocalDateTime.parse(params._source['offers'][0].validFrom), ZoneId.systemDefault()).toInstant().toEpochMilli()
这种手动日期解析给脚本带来了额外的复杂性。在我看来,它也不利于性能。 nested date field
是否可以直接在 elasticsearch 脚本中作为 date object
访问而不从 String 解析?
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"
}
}
]
此问题与有关。
这里的主题是区分 doc_values
and _source
个字段。
由于 doc_values
使用 return 基本类型,您可以在日期字段上访问 .millis
。但是 _source
本身是一个 JSON-ish,non-analyzed map-of-maps 所以你只能得到最初摄取的东西,不幸的是。
当您遇到性能问题时,我建议将嵌套的 validFrom
提取到顶层并调用它,例如 validFromOverride
。您的排序脚本逻辑复杂性将大大降低。
映射和文档结构不需要是不可变的。
在我的 ES 数据中,有 nested
和 parent
日期字段。我需要在一个 ES 无痛脚本中使用这些日期。使用 parent
日期很容易操作,因为它被视为 time object
。例如,要将 parent
日期 doc['validFrom']
转换为 UNIX 时间数字,我只使用:
doc['validFrom'].value.millis
但是对于像 params._source['offers'][0].validFrom
这样的 nested
日期操作是不同的情况。这些日期返回为 String
,而不是 date
。所以我必须手动将它们解析为 date
对象:
LocalDateTime.parse(params._source['offers'][0].validFrom), ZoneId.systemDefault()).toInstant().toEpochMilli()
这种手动日期解析给脚本带来了额外的复杂性。在我看来,它也不利于性能。 nested date field
是否可以直接在 elasticsearch 脚本中作为 date object
访问而不从 String 解析?
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"
}
}
]
此问题与
这里的主题是区分 doc_values
and _source
个字段。
由于 doc_values
使用 return 基本类型,您可以在日期字段上访问 .millis
。但是 _source
本身是一个 JSON-ish,non-analyzed map-of-maps 所以你只能得到最初摄取的东西,不幸的是。
当您遇到性能问题时,我建议将嵌套的 validFrom
提取到顶层并调用它,例如 validFromOverride
。您的排序脚本逻辑复杂性将大大降低。
映射和文档结构不需要是不可变的。