通过Tire gem进行Elasticsearch版本控制

时间:2012-04-26 15:27:43

标签: ruby-on-rails ruby elasticsearch tire

我有一个现有的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中的'版本控制'。似乎它主要用于并发控制。哦,好吧。 (不过我会很乐意听到)

1 个答案:

答案 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可以使用这些关系和查询。