Elasticsearch delete_by_query版本冲突

时间:2019-03-27 16:58:13

标签: elasticsearch

根据ES documentation文档的索引编制/删除操作如下:

  1. 在其中一个节点上收到请求。
  2. 请求已转发到文档的主分片。
  3. 对发送到副本节点的主分片和并行请求执行的操作。
  4. 主要分片节点等待副本节点的响应,然后将响应发送到最初接收该请求的节点。
  5. 将响应发送回客户端。

现在,在我的情况下,我将在t时刻向ES发送创建文档请求,然后在大约t + 800毫秒处发送删除同一文档的请求(使用delete_by_query)。这些请求是通过消息传递系统(kafka的内部实现)发送的,该系统确保仅在从ES接收到对索引操作的200 OK响应后,才将删除请求发送给ES。

根据ES documentation,只有在delete_by_query仍在执行的同时,删除查询中存在的文档已被更新时,delete_by_query才会引发409版本冲突。

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

请让我知道我是否缺少某些东西,或者这是ES的问题。

2 个答案:

答案 0 :(得分:0)

可能的原因可能是由于以下事实:创建文档时,它不会立即“提交”到索引中。

Elasticsearch索引的工作间隔为refresh_interval,默认值为1秒。

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

您可以尝试一些操作:

  1. Send _refresh with your request
  2. Add ?refresh=wait_for or ?refresh=true param

请注意,在每次建立索引请求时刷新索引都会导致性能下降,这引出了一个问题,即为什么您试图在建立索引之后立即删除文档。

答案 1 :(得分:0)

添加

deleteByQueryRequest.setAbortOnVersionConflict(false);