我有一个现有的Rails应用程序,它使用轮胎(0.4.0)与Elasticsearch(0.17.4)引擎连接。它已经有几个使用Tire :: Persistence的模型。我想添加一个利用Elasticsearch版本控制的新模型,以跟踪所有更改并能够恢复到以前的版本。
现在当我检索任何“持久”模型实例时,我会检查_version
,它始终是nil
。我还没有找到任何与版本控制相关的轮胎文档。我是否必须以某种方式激活它,或手动保存带有版本值的记录?我甚至在这里走在正确的轨道上吗?
我确实看到某些方法会为项目返回_version
值,但其他方法则不会...
Article.first._version # => nil
Article.search("sample query").first._version # => nil
Article.find("id_123")._version # => 8
此外,版本控制似乎增加了2.也许轮胎没有完全配备来处理版本控制。它保存以前的版本吗?如何检索以前版本的记录?
[编辑]我可能误解了Elasticsearch中的'版本控制'。似乎它主要用于并发控制。哦,好吧。 (不过我会很乐意听到)
答案 0 :(得分:2)
首先,是的,当您在编辑中编写时,ElasticSearch中的版本并不意味着存储文档的修订版,而是用于并发控制(例如,不覆盖具有陈旧版本的文档) )。
其次,您必须声明您希望从搜索返回的版本; http://www.elasticsearch.org/guide/reference/api/search/version.html
此代码向您展示如何在 Tire 中执行此操作。
require 'tire'
Tire.index('articles') do
delete
create
store id: 1, title: 'One'
store id: 2, title: 'Two'
store id: 2, title: 'Two again'
refresh
end
articles = Tire.search('articles') do
query { all }
version true
end.results
articles.each do |article|
puts "Article '#{article.title}' has version #{article._version}"
end
目前,最好阅读 Tyre 集成测试套件以获取文档。文档当然应该并且将会改进。
至于你原来的要求本身,过去常常为CouchDB提出类似的问题。 Simple Document Versioning with CouchDB博客文章介绍了一个不错的策略。由于文档模型类似,因此研究CouchDB解决方案对您有所帮助。 (当然,与ElasticSearch相反,CouchDB会实际存储文档修订版,因此它会打开不同的策略范围。)
在ElasticSearch中,您关于使用修订的基本决定是:
我是否要直接在JSON中存储完整版本?
这对于较小的文档和较小的数据库可能有意义。根据您的要求,它可以使搜索历史文档变得非常简单。
ElasticSearch中的Nested Type将使这些“修订为嵌套文档”变得方便和容易。
(你也可以在JSON本身中存储文档的“差异”,但这会给你的应用程序逻辑带来更大的压力,我敢打赌。)
我是否要将修订版存储为单独的文档?
您可能希望单独存储修订,并将它们与基础文档“链接”。 ElasticSearch中的parent/child support可以使用这些关系和查询。