根据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。
3条答案
按热度按时间webghufk1#
可能的原因是,当一个文档被创建时,它没有立即“提交”到索引。
Elasticsearch索引在refresh_interval上运行,默认为1秒。
This关于刷新周期的文档已经很老了,但是我在更现代的ES版本中找不到任何描述性的东西。
有几件事你可以试试:
请注意,在每次索引请求时刷新索引对性能来说是很糟糕的,这就引出了一个问题,即为什么要在索引文档后立即删除它。
x9ybnkn62#
添加
u91tlkcl3#
我添加了查询参数
conflicts=proceed
。Documentation