当前位置: 首页 > 面试题库 >

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

通宾白
2023-03-14
问题内容

我有一个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值匹配的所有元素来修改数组。



 类似资料:
  • 问题内容: 我的映射是: 我想获取所有没有字段的文档。 我试过了: 返回所有文档。基于ElasticSearch2.x,存在用于嵌套字段的过滤器不起作用的问题,我也尝试过: 返回0个文档。 使所有缺少该字段的文档的正确查询是什么? 问题答案: 我找到了正确的语法,应该是:

  • 我正在使用ElasticSearch5.4,试图从嵌套数据类型中删除一个元素。 我有以下映射: 我在《邮递员》中尝试过以下内容: localhost:9200/asset/bookmark/20976/_update?pretty 但我得到以下错误: 我在StackOverflow[1][2]的几个不同问题中遵循了这些建议,但没有成功。 嵌套对象是有效的,因为我已经用数据填充了它。此外,值也是有效

  • 我有一个模型,在几个模型中设置为外键。现在从模型中删除任何对象时,如果该对象在这些模型中被引用,则会抛出ProtectedError。我想让用户在一次操作中删除包含所有受保护对象的对象。 我只需调用 但是当有自己的受保护对象时,操作失败并抛出另一层。我想要实现的是,删除所有受保护的对象,而不区分它存在于哪一层。我知道这可能是一个危险的操作。但我能在没有复杂解决方案的情况下实现这一点吗。提前谢谢。

  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助

  • 我需要描述一个api,在请求体中有一个带有必填字段的对象,其中一个字段是一个对象本身,它有另一组必填字段。 我正在使用开放api v3和swagger编辑器(https://editor.swagger.io/)在我把我的。将yaml文件放到编辑器上,我生成了一个html客户端( 我希望字段1是必需的,字段2是可选的,但事实并非如此。 这是我的。yaml文件