2012-04-26 2 views
1

私は、Elasticsearch(0.17.4)エンジンとのインターフェースにタイヤ(0.4.0)を使用する既存のRailsアプリケーションを使用しています。すでにTire :: Persistenceを使用した2つのモデルがあります。私はElasticsearchのバージョン管理を利用してすべての変更を追跡し、以前のバージョンに戻すことができる新しいモデルを追加したいと考えています。タイヤ宝石による弾性検索バージョン

現在、「永続」モデルのインスタンスを取得すると、_versionをチェックし、常にnilです。私はバージョン管理に関連するタイヤのマニュアルを見つけられませんでした。何らかの形でそれを有効にする必要がありますか、手動でバージョン値でレコードを保存する必要がありますか?私はここでも正しい道を歩いていますか?

私は特定の方法は、項目について_version値を返すことがわかりますが、他の人が...

Article.first._version       # => nil 
Article.search("sample query").first._version # => nil 
Article.find("id_123")._version     # => 8 

また、バージョン管理は2ずつ増加するようではありませんおそらく、タイヤが完全にバージョン管理に対処するために装備されていません。以前のバージョンを保存していますか?以前のバージョンのレコードを取得するにはどうすればよいですか?

[編集]私は実際には 'バージョン管理'がElasticsearchにあると誤解しているかもしれません。主に並行性の制御のようだ。オハイオ州ウェルズ。

答えて

2

の編集では、ElasticSearchのバージョンはドキュメントのリビジョンを保存するのではなく、並行性の制御(例:not not)です。古いバージョンの文書を上書きする)。

第2に、バージョンを検索から戻すことを宣言する必要があります。 http://www.elasticsearch.org/guide/reference/api/search/version.html

このコードは、タイヤで行う方法を示しています。瞬間のために

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ソリューションを研究することは有益です。 (もちろん、CouchDBのは、物理的文書の改訂版を保存するんElasticSearchに反しては、これは戦略の異なる範囲を開きます。)ElasticSearchで

、リビジョンでの作業についてのあなたの基本的な決定は次のようになります。

ドI完全なリビジョンをJSON自体に直接保存したいですか?

これは、小規模な文書や小規模なデータベースでは意味があります。要件に応じて、履歴文書を簡単に検索することができます。

ElasticSearchのNested Typeは、これらの「ネストされたドキュメントとしてのリビジョン」を便利で簡単に扱えるようにします。

(ドキュメントの「diffs」だけをJSON自体に保存することもできますが、それはアプリケーションロジックに大きな負担をかけることになります。)

リビジョンを別々のドキュメントとして保存したいですか?

リビジョンを別々に保存し、それらのベースドキュメントにリンクすることができます。 ElasticSearchのparent/child supportは、これらのリレーションシップとクエリを処理することを可能にします。