gpt4 book ai didi

elasticsearch - elasticsearch脚本来检查字段是否存在并创建它

转载 作者:行者123 更新时间:2023-12-02 22:48:58 24 4
gpt4 key购买 nike

我创建了一个脚本,该脚本以 flex 方式记录了应用于文档的标签的历史记录。标记的名称是动态的,因此当我尝试将当前标记移到“历史记录”字段时,对于尚未具有历史记录字段的标记,它会失败。

这是将当前标签复制到标签历史记录字段的脚本:

script:"ctx._source.tags[params.tagName.toString()].history.add(ctx._source.tags[params.tagName.toString()].current)"

这是文档的样子:
"tags": {
"relevant": {
"current": {
"tagDate": 1501848372292,
"taggedByUser": "dev",
"tagActive": true
},
"history": [
{
"tagDate": 1501841137822,
"taggedByUser": "admin",
"tagActive": true
},
{
"tagDate": 1501841334127,
"taggedByUser": "admin",
"tagActive": true
},
}}}}

用户可以动态添加新标签,所以我想做的是创建历史对象(如果它不存在),然后可以填充它。

Elasticsearch脚本的可用文档很少,因此我希望明智的人会知道答案,因为我确定检查字段并创建它是 flex 脚本语言的基础。

更新

因此,在重新考虑了该索引的结构之后,我想实现以下目标:
tags:[
{hot:
{current:{tagDate:1231231233, taggedbyUser: user1, tagStatus: true},
history:[ {tagDate:123444433, taggedbyUser: user1, tagStatus: true},
{tagDate:1234412433, taggedbyUser: user1, tagStatus: true}
]
}

{interesting:
{current:{tagDate:1231231233, taggedbyUser: user1, tagStatus: true},
history:[ {tagDate:123444433, taggedbyUser: user1, tagStatus: true},
{tagDate:1234412433, taggedbyUser: user1, tagStatus: true}
]
}
]

在此示例中,标签名称是“热门”和“有趣”,但是用户将能够输入他们想要的任何标签名称,因此这些标签名称绝不是预定义的。当用户使用 flex 标记文档并且所应用的标记已经 flex 存在时,它应将“当前”标记更多地添加到“历史”数组中,然后用新值覆盖“当前”标记。

感谢您迄今为止的答复,但是示例代码对我不起作用。

我认为我遇到的问题是,首先,代码将需要遍历所有标签并获取名称。然后,我想将每个参数与我在参数中提供的名称进行比较。我认为这是第一个问题出现的地方。

然后,我需要将“当前”对象移动到“历史”数组。这里似乎也有问题。我正在尝试使用“ctx._source.tags [i] .history.add(params.param1),但是未添加任何内容。

有什么想法吗?

谢谢!

最佳答案

这有点复杂,因为您需要在脚本中做三件事:

  • 如果history不存在,则初始化数组
  • 将当前标签移至历史记录
  • 用新的
  • 替换旧的 current标签

    假设您的初始文档看起来像这样(请注意还没有 history):
    {
    "_id": "AV2uvqCUfGXyNt1PjTbb",
    "tags": {
    "relevant": {
    "current": {
    "tagDate": 1501848372292,
    "taggedByUser": "dev",
    "tagActive": true
    }
    }
    }
    }

    为了能够执行这三个步骤,您需要运行以下脚本:
    curl -X POST \
    http://127.0.0.1:9200/script/test/AV2uvqCUfGXyNt1PjTbb/_update \
    -d '{
    "script": {
    "inline": "if (ctx._source.tags.get(param2).history == null) ctx._source.tags.get(param2).history = new ArrayList(); ctx._source.tags.get(param2).history.add(ctx._source.tags.get(param2).current); ctx._source.tags.get(param2).current = param1;",
    "params" : {
    "param1" : {
    "tagDate": 1501848372292,
    "taggedByUser": "my_user",
    "tagActive": true
    },
    "param2": "relevant"
    }
    }
    }'

    结果是:
    {
    "_id": "AV2uvqCUfGXyNt1PjTbb",
    "_source": {
    "tags": {
    "relevant": {
    "current": {
    "tagActive": true,
    "tagDate": 1501848372292,
    "taggedByUser": "my_user"
    },
    "history": [
    {
    "tagDate": 1501848372292,
    "taggedByUser": "dev",
    "tagActive": true
    }
    ]
    }
    }
    }
    }

    使用 parm1(新标记)的新内容运行相同的脚本会得到:
    {
    "_id": "AV2uvqCUfGXyNt1PjTbb",
    "_source": {
    "tags": {
    "relevant": {
    "current": {
    "tagActive": true,
    "tagDate": 1501841334127,
    "taggedByUser": "admin"
    },
    "history": [
    {
    "tagDate": 1501848372292,
    "taggedByUser": "dev",
    "tagActive": true
    },
    {
    "tagActive": true,
    "tagDate": 1501848372292,
    "taggedByUser": "my_user"
    }
    ]
    }
    }
    }
    }

    更新-如果`tags'是列表

    如果 tags是“内部json对象”的列表,例如:
    {
    "tags": [
    {
    "relevant": {
    "current": {
    "tagDate": 1501841334127,
    "taggedByUser": "dev",
    "tagActive": true
    }
    }
    },
    {
    "new_tag": {
    "current": {
    "tagDate": 1501848372292,
    "taggedByUser": "admin",
    "tagActive": true
    }
    }
    }
    ]
    }

    您必须遍历列表以找到正确元素的索引。假设您要更新元素 new_tag。首先,您需要检查此标记是否存在-如果存在,请获取其索引,如果不存在,请从脚本返回。有了索引,只需获取正确的元素即可,您几乎可以像以前一样进行操作。该脚本如下所示:
    int num = -1;
    for (int i = 0; i < ctx._source.tags.size(); i++) {
    if (ctx._source.tags.get(i).get(param2) != null) {
    num = i;
    break;
    };
    };
    if (num == -1) {
    return;
    };
    if (ctx._source.tags.get(num).get(param2).history == null)
    ctx._source.tags.get(num).get(param2).history = new ArrayList();
    ctx._source.tags.get(num).get(param2).history.add(ctx._source.tags.get(num).get(param2).current);
    ctx._source.tags.get(num).get(param2).current = param1;

    和wole查询:
    curl -X POST \
    http://127.0.0.1:9200/script/test/AV29gAnpqbJMKVv3ij7U/_update \
    -d '{
    "script": {
    "inline": "int num = -1; for (int i = 0; i < ctx._source.tags.size(); i++) {if (ctx._source.tags.get(i).get(param2) != null) {num = i; break;};}; if (num == -1) {return;}; if (ctx._source.tags.get(num).get(param2).history == null) ctx._source.tags.get(num).get(param2).history = new ArrayList(); ctx._source.tags.get(num).get(param2).history.add(ctx._source.tags.get(num).get(param2).current); ctx._source.tags.get(num).get(param2).current = param1;",
    "params" : {
    "param1" : {
    "tagDate": 1501848372292,
    "taggedByUser": "my_user",
    "tagActive": true
    },
    "param2": "new_tag"
    }
    }
    }
    '

    结果:
    {
    "tags": [
    {
    "relevant": {
    "current": {
    "tagDate": 1501841334127,
    "taggedByUser": "dev",
    "tagActive": true
    }
    }
    },
    {
    "new_tag": {
    "current": {
    "tagActive": true,
    "tagDate": 1501848372292,
    "taggedByUser": "my_user"
    },
    "history": [
    {
    "tagDate": 1501848372292,
    "taggedByUser": "admin",
    "tagActive": true
    }
    ]
    }
    }
    ]
    }

    关于elasticsearch - elasticsearch脚本来检查字段是否存在并创建它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505363/

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