gpt4 book ai didi

elasticsearch - 如何使用自定义对象作为键来创建HashMap?

转载 作者:行者123 更新时间:2023-12-02 23:08:48 25 4
gpt4 key购买 nike

在Elasticsearch中,我有一个包含对象数组的对象。数组中的每个对象都有typeidupdateTimevalue字段。

我的输入参数是一个数组,其中包含相同类型但值和更新时间不同的对象。我想在它们存在时用新值更新对象,而在不存在时创建新值。

我想使用无痛脚本来更新这些脚本,但要使其与众不同,因为其中某些脚本可能会重叠。问题是我需要同时使用typeid来保持它们唯一。到目前为止,我已经通过蛮力方法,嵌套的for循环并比较两个数组的元素来完成了,但是我对此并不满意。

想法之一是从源中获取数组,构建临时HashMap以进行快速查找,处理输入,然后将所有对象存储回源中。

我可以使用自定义对象(带有typeid的类)作为键来创建HashMap吗?如果是这样,该怎么办?我无法将类定义添加到脚本中。

这是映射。所有字段都被“禁用”,因为我仅将它们用作中间状态并使用其他字段进行查询。

{
"properties": {
"arrayOfObjects": {
"properties": {
"typ": {
"enabled": false
},
"id": {
"enabled": false
},
"value": {
"enabled": false
},
"updated": {
"enabled": false
}
}
}
}
}

示例文档

{
"arrayOfObjects": [
{
"typ": "a",
"id": "1",
"updated": "2020-01-02T10:10:10Z",
"value": "yes"
},
{
"typ": "a",
"id": "2",
"updated": "2020-01-02T11:11:11Z",
"value": "no"
},
{
"typ": "b",
"id": "1",
"updated": "2020-01-02T11:11:11Z"
}
]
}

最后是当前形式的脚本的一部分。该脚本还执行其他一些操作,因此为了简洁起见,我将其删除。

if (ctx._source.arrayOfObjects == null) {
ctx._source.arrayOfObjects = new ArrayList();
}
for (obj in params.inputObjects) {
def found = false;
for (existingObj in ctx._source.arrayOfObjects) {
if (obj.typ == existingObj.typ && obj.id == existingObj.id && isAfter(obj.updated, existingObj.updated)) {
existingObj.updated = obj.updated;
existingObj.value = obj.value;
found = true;
break;
}
}
if (!found) {
ctx._source.arrayOfObjects.add([
"typ": obj.typ,
"id": obj.id,
"value": params.inputValue,
"updated": obj.updated
]);
}
}

最佳答案

从技术上讲,您的方法没有次优的选择。
HashMap可能可以节省一些时间,但是由于您正在编写脚本,因此您已经陷入了先天的低效率...顺便说一句,您可以初始化here's how并使用HashMaps。

另一种方法是重新考虑数据结构-而不是使用键对象或类似对象的对象数组。对象数组不适用于频繁更新。

最后一个提示:您说过这些字段仅用于存储某些中间状态。如果不是这种情况(或者将来不会),我建议使用 nested 数组来独立于array中的其他对象进行查询。

关于elasticsearch - 如何使用自定义对象作为键来创建HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62452304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com