Elasticsearch 脚本:可以将嵌套日期作为日期对象直接访问吗?

Elasticsearch script: can a nested date be accessed directly as a date object?

在我的 ES 数据中,有 nestedparent 日期字段。我需要在一个 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。您的排序脚本逻辑复杂性将大大降低。

映射和文档结构不需要是不可变的。