Elasticsearch delete_by_query 版本冲突

Rah*_*mar 7 elasticsearch

根据 ES文档,文档索引/删除发生如下:

  1. 在节点之一收到请求。
  2. 请求转发到文档的主分片。
  3. 在主分片上执行的操作以及发送到副本节点的并行请求。
  4. 主分片节点等待副本节点的响应,然后将响应发送到最初收到请求的节点。
  5. 将响应发送回客户端。

现在,就我而言,我在时间 t 向 ES 发送创建文档请求,然后在大约 t+800 毫秒发送删除同一文档的请求(使用 delete_by_query)。这些请求通过消息系统(kafka的内部实现)发送,该系统确保只有在收到来自ES的索引操作的200 OK响应后,删除请求才会发送到ES。

根据ES文档,仅当删除查询中存在的文档在delete_by_query仍在执行期间已更新时,delete_by_query才会引发409版本冲突。

就我而言,始终保证仅当收到所有必须删除的文档的 200 OK 响应时,delete_by_query 请求才会发送到 ES。因此,在delete_by_query操作期间不可能更新/创建必须删除的文档。

如果我遗漏了什么或者这是 ES 的问题,请告诉我。

rya*_*gen 5

可能的原因可能是由于创建文档时,它没有立即“提交”到索引。

Elasticsearch 索引按刷新间隔运行,默认为 1 秒。

关于刷新周期的文档很旧,但我一生都找不到更现代的 ES 版本中的描述性内容。

您可以尝试以下几件事:

  1. 发送 _refresh 和您的请求
  2. 添加 ?refresh=wait_for 或 ?refresh=true 参数

请注意,在每个索引请求上刷新索引对性能来说非常糟糕,这引出了一个问题:为什么您试图在索引文档后立即删除它。


小智 5

添加

deleteByQueryRequest.setAbortOnVersionConflict(false);
Run Code Online (Sandbox Code Playgroud)