更新ElasticSearch Document同时保持其外部版本相同?

时间:2013-07-27 17:57:55

标签: elasticsearch elastica

我想在保持文档版本相同的同时更新ElasticSearch文档。我正在使用versioning section of the index_ documentation中指示的version_type = external。如that section中所示,通常会阻止使用相同版本的另一个文档更新文档:“如果提供的值小于或等于存储文档的版本号,则会发生版本冲突,索引操作将失败。 “

我想保持版本不变的原因是因为我没有为该对象添加新标签时创建我的对象的新版本(存储在我的数据库中),但我希望新标签显示在我的ElasticSearch索引。这可以用ElasticSearch吗?

我尝试删除该文档,然后添加一个具有相同ID和版本的新文档,但仍然给出了以下例外情况:

  

VersionConflictEngineException [[myindex] [2] [mytype] [6]:版本   冲突,当前1,提供1]

仅供参考,我使用的是PHP Elastica(方法$type->deleteDocument($doc);$type->addDocument($doc);),但这个问题一般适用于ElasticSearch。

1 个答案:

答案 0 :(得分:2)

elasticsearch保存有关已删除文档的信息的时间由index.gc_deletes参数控制。默认情况下,此时间为1m。因此,理论上,您可以将此时间减少到0s,等待一秒钟,删除文档,使用相同版本索引新文档,然后将index.gc_deletes设置回1m。但目前由于bug而只能在master上工作。如果您使用的是旧版本的elasticsearch,则无法在不先关闭索引的情况下更改index.gc_deletes

elasticsearch.org网站上有一个很好的blog post,详细描述了elasticsearch如何处理版本。