Elasticsearch - 使用java api删除嵌套对象无法正常工作

时间:2015-11-20 11:00:40

标签: java elasticsearch

我有一个包含嵌套对象的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"
          }
        }
      }
    }
  }
}

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

1 个答案:

答案 0 :(得分:2)

由于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配置中有dynamic scripting enabled

<强>更新

你可以尝试一个&#34; groovy-er&#34;从列表中删除元素的方法,即不再需要for循环和if,只需使用常规功能:

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

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