勉強の記録

機械学習、情報処理について勉強した事柄など

latest transformを利用してdocumentの履歴を管理する

文書の変更履歴を追いたい場合、SQLでは「履歴テーブル」を利用することが多いかもしれません。

ここではウィンドウ関数「row_number」を使って工夫していますが、毎クエリで論理ドキュメントIDごとにaggregationして最新ドキュメントを取ってくるのも大変です。

elasticsearchでは同様の文書履歴の管理はできるでしょうか。「elasticsearch document history」などで検索するとちょっと古い質問がヒットします。

Elasticsearch - Maintaining Document History - Stack Overflow How to store document history (versioning, revisions)? - Elasticsearch - Discuss the Elastic Stack

「できません」という回答が目に留まります。

一方で、elasticsearchの7.11(2021/2)からData Transformに「latest」が追加され、利用できるようになりました。

(Data Transform機能については↓こちらが分かりやすいです。「OSS版のElasticsearchでは使えない」とあるが、今はFREE AND OPENでも利用可能っぽい?)

このlatest機能によって、"履歴インデックス"から論理IDごとに最新の文書を取得し、宛先のインデックスに自動で投入できるようになります。

body = {
    'source': {'index': 'test_source'},
    'latest':{'sort':'更新日時フィールド', 
        'unique_key': '論理IDフィールド'}
}

以上の内容のtransformを登録すれば、transformが定期的に(defaultでは1分ごと)実行され、論理IDごとに最新の文書のみを保持したインデックスが生成されます。

ノード障害時には回復プロセスが一部のTransformationを繰り返す可能性はありますが、データのconsistencyは保たれるようです(How transform checkpoints work / Error handling)。

一方で、ソースインデックスは必要に応じて論理IDおよび更新日時以外のフィールドを ・{'type': 'object', 'enabled':False} ・{'type': varies, 'index: false, 'doc_values': false} などとすることでインデックスサイズを節約することもできそうです。

{'type': 'object', 'enabled':False}としてしまうと、データのチェックが効かないので基本的には後者が良いでしょうか。

また、latestおよびunique_keyで指定するフィールドは、doc_value: Trueとする必要がありました。indexはFalseにしてもData Transformは実行されましたが、performance上の問題が生じ得るのでTrueにしておいた方が無難かもしれません。

参考までに。