如果在应用更新之前对文档进行更改,那么使用update
API对文档的部分更新似乎会失败:
为了避免丢失数据,update API在检索步骤中检索文档的当前_version,并在重新索引步骤中将其传递给索引请求。如果另一个进程在检索和重新索引之间更改了文档,那么_version编号将不匹配,更新请求将失败。
然后,它继续说,您可以提供retry_on_conflict
,如果确实发生冲突,它将重试写:
对于许多部分更新的使用,文档被更改并不重要. 这可以通过将retry_on_conflict参数设置为失败前更新应该重试的次数来自动完成;它默认为0。
因此,如果我在不提供update
字段的情况下,使用retry_on_conflict
为3的retry_on_conflict
API,那么ES将在内部失败一次(如果确实发生冲突),然后重试并重写与其冲突的值?
看起来是这样,因为
默认情况下,...the更新API采用最后写赢的方法。
来源:conflicts
注:我使用的是ES 1.5
发布于 2016-10-25 06:18:48
是的,就是这样。关于retry and overwrites the value that it was conflicting with
声明的澄清:冲突与文档的版本(不是文档中的任意字段)发生冲突,让我们明确这一点,这是ES GETing文档与实际编写新(更新)文档之间的内部冲突(这两个操作是_update
操作的一部分)。
而且它没有覆盖它与之冲突的值,它是另一个更新操作,一旦版本检查正常,它就会成功,并且,是的,它将更新索引中的文档。
如果您需要确保您的更新按一定顺序进行,,则需要使用版本。
https://stackoverflow.com/questions/40232355
复制相似问题