gpt4 book ai didi

java - Elasticsearch - 使用 java api 删除嵌套对象不起作用

转载 作者:行者123 更新时间:2023-11-30 03:09:54 25 4
gpt4 key购买 nike

我有一个 elasticsearch 文档,其中包含嵌套对象,我希望能够通过 java update api 删除它们。这是包含脚本的代码:

UpdateRequest updateRequest = new UpdateRequest(INDEX, "thread", String.valueOf(threadId));
updateRequest.script("for (int i = 0; i < ctx._source.messages.size(); i++){if(ctx._source.messages[i]._message_id == " + messageId + ")" +
"{ctx._source.messages.remove(i);i--;}}", ScriptService.ScriptType.INLINE);
client.update(updateRequest).actionGet();

这是我的文档的映射:

{
"thread_and_messages": {
"mappings": {
"thread": {
"properties": {
"messages": {
"type": "nested",
"include_in_parent": true,
"properties": {
"message_id": {
"type": "string"
},
"message_nick": {
"type": "string"
},
"message_text": {
"type": "string"
}
}
},
"thread_id": {
"type": "long"
}
}
}
}
}
}

我没有收到任何错误消息,但是当我在索引上运行查询以查找该嵌套文档时,它尚未被删除。有人可以让我知道我做错了什么吗?

最佳答案

由于 message_id 是一个字符串,因此您的脚本需要考虑它并进行如下修改(请参阅 message_id 周围的转义双引号) field )。还有第二个拼写错误,您的映射声明了 message_id 字段,但您在脚本中将其命名为 _message_id:

"for (int i = 0; i < ctx._source.messages.size(); i++){if(ctx._source.messages[i].message_id == \"" + messageId + "\")"
^ ^ ^
| | |
no underscore here add escaped double quotes

最后还要确保您有 dynamic scripting enabled在你的 ES 配置中

更新

您可以尝试“groovy-er”方式从列表中删除元素,即不再使用 for 循环和 if,只需使用 groovy 功能​​:

"ctx._source.messages.removeAll{ it.message_id == \"" + messageId + "\"}"

通常,这将通过删除 message_id 字段与 messageId 值匹配的所有元素来修改 messages 数组。

关于java - Elasticsearch - 使用 java api 删除嵌套对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33825029/

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