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_id
是一个string
您的脚本需要对其进行说明并像这样进行修改(请参阅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配置中启用了动态脚本
UPDATE
您可以尝试一种“groovy-er”方式从列表中删除元素,即不再for
循环, if
,只需使用groovy power:
"ctx._source.messages.removeAll{ it.message_id == \"" + messageId + "\"}"
通常,这将通过删除其message_id
字段与messageId
值匹配的所有元素来修改messages
数组。
- 如何在Elasticsearch java api中找到Alias索引?
- Elasticsearch服务器发现配置
- 在ElasticSearch中获取SearchResponse的结果
- Elasticsearch:使用Java添加手动映射
- 弹性搜索java.lang.NoClassDefFoundError:org / elasticsearch / transport / Netty3Plugin
- ElasticSearch索引存在不可行/可靠
- elasticsearch – 没有为注册的查询]
- Elasticsearch映射设置’not_analyzed’并在Java中按字段分组
- elasticsearch将对象插入索引