Elasticsearch-使用Java API删除嵌套对象不起作用

我有一个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_idstring您的脚本,所以需要对其进行说明并按如下方式进行修改(请参见该message_id字段周围的转义双引号)。还有第二种错字,就是您的映射声明了一个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

最后,还要确保在ES配置中启用了动态脚本

您可以尝试从列表中删除元素的“常规”方式,即不再使用forloop和if,只需使用常规功能即可:

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

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

以上是 Elasticsearch-使用Java API删除嵌套对象不起作用 的全部内容, 来源链接: utcz.com/qa/406810.html

回到顶部