1

タイヤ(0.4.0)を使用してElasticsearch(0.17.4)エンジンとインターフェースする既存のRailsアプリがあります。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

まず第一に、はい、あなたが編集で書くとき、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について同様の質問が定期的に出てきました。CouchDBを使用した単純なドキュメントのバージョン管理に関するブログ投稿では、1つの優れた戦略について説明しています。ドキュメントモデルは類似しているため、CouchDBソリューションを調査することは有益です。(もちろん、ElasticSearchとは異なり、CouchDBはドキュメントのリビジョンを物理的に保存するため、さまざまな戦略が開かれます。)

ElasticSearchでは、リビジョンの操作に関する基本的な決定は次のようになります。

完全なリビジョンをJSON自体に直接保存しますか?

これは、小さなドキュメントや小さなデータベースにとって意味があります。要件によっては、履歴ドキュメントの検索が非常に簡単になる場合があります。

ElasticSearchのネストされたタイプを使用すると、これらの「ネストされたドキュメントとしてのリビジョン」を便利かつ簡単に操作できます。

(ドキュメントの「差分」だけをJSON自体に格納することもできますが、それではアプリケーションロジックにさらに負担がかかるでしょう。)

リビジョンを個別のドキュメントとして保存しますか?

リビジョンを個別に保存し、それらをベースドキュメントに「リンク」することをお勧めします。ElasticSearchの親子サポートにより、これらの関係とクエリを操作できるようになります。

于 2012-04-27T08:33:54.433 に答える