elasticsearch脚本:嵌套日期能否作为日期对象直接访问?

wj8zmpe1  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(424)

在我的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"
            }
        }
    ]
h7wcgrx3

h7wcgrx31#

这个问题和这个有关。
这里的主题是区分 doc_values 以及 _source 领域。
doc_values 如果返回基元类型,则可以访问 .millis 在日期字段。但是 _source 它本身是一个json格式的、未经分析的Map,所以很遗憾,您只能得到最初摄取的内容。
当您在性能方面遇到问题时,我建议您提取嵌套的 validFrom 到最高层打电话,比如说, validFromOverride . 排序脚本的逻辑复杂性将大大降低。
Map和文档结构不需要是不变的。

相关问题