更新不存在的文档时,弹性搜索不会给我任何错误

Posted

技术标签:

【中文标题】更新不存在的文档时,弹性搜索不会给我任何错误【英文标题】:Elastic Search doesn't give me any error when updating non existent document 【发布时间】:2022-01-11 16:06:27 【问题描述】:

我正在使用 Spring Data ElasticSearch(Spring Boot parent v2.6.1,Elastic Search 7.15.2)在 ElasticSearch 中运行 updateByQuery 操作。

在我的 ES 索引中,我存储了 2 个文档。

当我在搜索中给出一个不存在的文档时,它不会给我任何错误,因此我无法区分更新是否实际运行。

现有文档的更新工作正常。我想找到一种方法,如果没有编辑任何行,我可以记录它。

我应该看什么?如果有更新,我应该更改哪些内容才能收到一些消息?

这是我的代码 sn-p:

UpdateByQueryRequest request = new UpdateByQueryRequest('index');
    Map<String, Object> data = new HashMap<>();
    data.put("marks", "30");
    data.put("name", "timmy");
    data.put("roll_number", "10");
    request.setScript(
            new Script(
                ScriptType.INLINE, "painless",
                "if (ctx._source.name == params.name && ctx._source.roll_number == params.roll_number) ctx._source.marks=params.marks;",
                data));
    BulkByScrollResponse resp = globalClient.updateByQuery(request, RequestOptions.DEFAULT);
    log.info("response: ",resp.getStatus());

我也添加了响应状态。我觉得奇怪的是,在存在和不存在文档的情况下,updated 参数计数为2,与我索引中的文档数量相同。

记录不存在时的响应:

response: BulkIndexByScrollResponse[sliceId=null,updated=2,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]

在现有记录的情况下响应:

response: BulkIndexByScrollResponse[sliceId=null,updated=2,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]

【问题讨论】:

【参考方案1】:

这是纯 Elasticsearch 代码,没有来自 Spring Data Elasticsearch。

您在哪里指定查询?我在您的代码中没有看到任何内容。这意味着所有文档都将被更新 - 在您的情况下为 2 个。

【讨论】:

我正在关注elastic.co/guide/en/elasticsearch/client/java-rest/current/… 中的脚本示例,其中传递了一个脚本以根据条件修改文档 在该页面上:“您可以通过添加查询来限制文档。”您没有设置查询,这就是所有文档都会更新的原因。 知道了。我的印象是这个脚本也可以用作查询和更新

以上是关于更新不存在的文档时,弹性搜索不会给我任何错误的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose findOneAndUpdate() 仅在文档​​已存在时更新,如果不存在则不创建新文档?

存在元标记时,HTML5 Canvas 不显示图像

类型“文档<any>”上不存在属性“密码”

Mongodb如何仅在不存在时插入(如果存在则不更新)?

如果 firebase 文档不存在则抛出错误

Certbot 在 httpd.conf 中不存在的行上给我语法错误