1

我有一个现有的 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 中的“版本控制”实际上是什么。似乎它主要用于并发控制。哦,好吧。(不过,我很想听听其他的)

4

1 回答 1

2

首先,是的,正如您在Edit中所写,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

目前,最好阅读轮胎集成测试套件的文档。文档当然是应该并且将会改进的东西。

至于您最初的需求本身,过去经常会向 CouchDB 提出类似的问题。Simple Document Versioning with CouchDB博客文章描述了一种不错的策略。研究 CouchDB 解决方案对您很有帮助,因为文档模型是相似的。(当然,与 ElasticSearch 不同,CouchDB 确实物理存储了文档修订,因此它开启了不同的策略范围。)

在 ElasticSearch 中,关于使用修订的基本决定是:

我想直接在 JSON 本身中存储完整的修订吗?

这对于较小的文档和较小的数据库可能有意义。根据您的要求,它可以使搜索历史文档变得非常简单。

ElasticSearch 中的嵌套类型将使这些“作为嵌套文档的修订”变得方便和容易。

(您也可以在 JSON 本身中存储文档的“差异”,但我敢打赌,这会给您的应用程序逻辑带来更多压力。)

我想将修订存储为单独的文档吗?

您可能希望单独存储修订,并将它们“链接”到它们的基础文档。ElasticSearch 中的父/子支持将使处理这些关系和查询成为可能。

于 2012-04-27T08:33:54.433 回答