web-dev-qa-db-ja.com

Elastic Searchバージョンを使用して以前の_sourceドキュメントを取得できますか

versioning に関するESのブログ投稿を読みました。

ただし、更新から以前の "_souce"ドキュメントを取得できるようにしたいと考えています。

たとえば、次のオブジェクトがあるとします。

{
    "name": "John",
    "age": 32,
    "job": "janitorial technician"
}
// this becomes version 1

そして私はそれを次のように更新します:

{
    "name": "John",
    "age": 32,
    "job": "president"
}
// this becomes version 2

次に、ESでのバージョン管理により、オブジェクトの以前の「ジョブ」プロパティを取得できますか?私はこれを試しました:

curl -XGET "localhost:9200/index/type/id?version=1"

しかし、これは最新の_sourceオブジェクト(Johnが社長であるオブジェクト)を返すだけです。

StackOverflowと同じように、バージョンの違いを実装したいのですが。 (ところで、私はメインのデータベースとしてelastic-searchを使用しています。他のnosqlデータベースでこれを行う方法がある場合は、試してみたいと思います。できれば、ESとうまく統合できるものです。)

49
swatkins

いいえ、組み込みのバージョン管理を使用してこれを行うことはできません。必要なのは、現在のバージョン番号を保存して、アップデートを順不同で適用しないようにすることです。

複数のバージョンを利用できるようにしたい場合は、自分で実装する必要があります。保存する可能性のあるバージョンの数に応じて、次の3つのアプローチを取ることができます。

少量の変更の場合

1)同じドキュメント内に古いバージョンを保存する

{ text: "foo bar",
  date:  "2011-11-01",
  previous: [
      { date: '2011-10-01', content: { text: 'Foo Bar' }},
      { date: '2011-09-01', content: { text: 'Foo-bar!' }},
  ]
}

大量の変更の場合

2)currentフラグを追加します:

{
   doc_id:  123,
   version: 3,
   text:    "foo bar",
   date:    "2011-11-01",
   current: true
}

{
   doc_id:  123,
   version: 2,
   text:    "Foo Bar",
   date:    "2011-10-01",
   current: false
}

3)上記(2)と同じですが、古いバージョンを別のインデックスに保存するため、クエリの大部分で使用される「ライブ」インデックスを維持し、小規模でパフォーマンスが向上します。

65
DrTech