エラスティック検索に存在しないドキュメントを更新しようとしているときに、UpdateByQuery API の問題に直面しています
問題の説明
test_index-2020.03.11、test_index-2020.03.12… のように毎日 1 つのインデックスを作成し、8 日間 (今日と先週の 7 日間) のインデックスを維持します。
データが到着すると (Kafka トピックから 1 つずつまたは一括で読み取る)、指定された ID のデータが既に存在する場合は更新する必要があります (8 日間のインデックスのいずれかに存在する可能性があります)。存在しない場合は保存します (現在の日指数)。
解決策、私は現在、データが1つずつ到着したときに試しています:
インライン スクリプトで UpdateByQuery を使用してドキュメントを更新する
BulkByScrollResponse が更新カウント 0 を返す場合は、ドキュメントを保存します
問題:
ドキュメントがまだ存在しない場合でも、次のように BulkByScrollResponse が更新されたフィールドを非ゼロ (1,2,3,4…) として返すことがわかります。
BulkIndexByScrollResponse[sliceId=null,updated=1,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]
このため、ドキュメントの保存リクエストをトリガーできません。
大量のドキュメント (一連の異なるドキュメント ID を持つ) を 1 回のリクエストでそれぞれのコンテンツで更新する必要がある場合、どのようにアプローチすればよいですか? UpdateByQuery で達成できますか?
注: 1 時間あたりに処理されるデータの量を考慮すると、Elasticsearch への複数のヒットを避ける必要があります。
ドキュメント ID は、str1:str2:Used:Sat Mar 14 23:34:39 IST 2020 の形式です。
しかし、ドキュメントがまだ存在しない場合でも、更新されたカウントがゼロではないことがわかります
私が試みているアプローチについてさらにいくつかのポイントを追加します。 "number_of_shards": 10, "number_of_replicas": 1 - 実際のドキュメントがどのインデックスに存在するかわからないため、このアプローチを使用します
一致するドキュメントが最大 1 つある場合、応答の更新済みフィールドには 1 つを超えてはなりません
以下は、応答の一部として取得する出力のカップルです: BulkIndexByScrollResponse[sliceId=null,updated=9,created=0,deleted=0,batches=1,versionConflicts=1,noops=0,retries=0,throttledUntil= 0s] BulkIndexByScrollResponse[sliceId=null,updated=10,created=0,deleted=0,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s]