Elasticsearch delete_by_query版本冲突

xdnvmnnf  于 12个月前  发布在  ElasticSearch
关注(0)|答案(3)|浏览(207)

根据ES documentation,文档索引/删除发生如下:
1.在其中一个节点上收到的请求。
1.请求转发到文档的主分片。
1.在主分片上执行的操作和发送到副本节点的并行请求。
1.主分片节点等待来自副本节点的响应,然后将响应发送到最初接收请求的节点。
1.将响应发送回客户端。
现在,在我的例子中,我在时间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。

webghufk

webghufk1#

可能的原因是,当一个文档被创建时,它没有立即“提交”到索引。
Elasticsearch索引在refresh_interval上运行,默认为1秒。
This关于刷新周期的文档已经很老了,但是我在更现代的ES版本中找不到任何描述性的东西。
有几件事你可以试试:

  1. Send _refresh with your request
  2. Add ?refresh=wait_for or ?refresh=true param
    请注意,在每次索引请求时刷新索引对性能来说是很糟糕的,这就引出了一个问题,即为什么要在索引文档后立即删除它。
x9ybnkn6

x9ybnkn62#

添加

deleteByQueryRequest.setAbortOnVersionConflict(false);
u91tlkcl

u91tlkcl3#

我添加了查询参数conflicts=proceedDocumentation

POST http://www.my-elasticsearch-host.com/objects/_delete_by_query?conflicts=proceed

相关问题