Solrでの削除が`_version_`の競合により失敗する

トピック作成者:ks-solruserml-bot (2024/09/11 21:51 投稿)
3
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/y6gf6cv610vmctk92xs09y5lxffvt3zc into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

こんにちは、

Solr Cloudコレクションから、ユニークID、_route_、および_version_に基づいて製品を削除するためのPythonの小さなスクリプトを書きました。

SolrインデックスからユニークID、_route_、および_version_の正確な値を抽出し、それらを使って製品を削除しようとしましたが、スクリプトがエラーを出し、使用した_version_が正しくないことを示しています。エラーメッセージは次のようになります:

"msg":"Async exception during distributed update: Error from server at
http://solr_ip:port/solr/collection_name/: null\n\n\nrequest:\nhttp://solr_ip:port/solr/collection_name/
Remote error message: version
conflict for {unique id} expected=1784635392440402000
actual=1784635392440401920",
"code":409}}
  1. 実際の_version_がクエリで表示されているものと異なるのは、どうしてでしょうか?

  2. ドキュメントの実際の_version_を取得する方法はありますか?

  3. _version_を使用してSolrドキュメントを削除する他の方法はありますか?

返信投稿者:ks-solruserml-bot (2024/09/11 21:51 投稿)
  1. クエリリクエストと削除リクエストの間に、ドキュメントを更新する可能性のある何かが動作していませんか? 一つのシャード内に同じuniqueKeyの値を持つドキュメントが複数存在していませんか? これらの条件がどちらかに当てはまる場合、自動生成される_version_のようなフィールドは変更される可能性があります。

  2. そのドキュメントに一致するクエリを実行すれば、_version_フィールドが検索結果に表示されるはずです。複数のシャードに同じuniqueKeyの値を持つドキュメントがある場合、どのドキュメントが返されるかは予測できません。Solrは結果を返す際に重複を排除するので、各uniqueKeyフィールドの値に対して一つのドキュメントしか返されません。

  3. 暗黙のルーターを使用している場合、単にdeleteByIdを使用してuniqueKeyフィールドの値を指定すれば、削除リクエストはすべてのシャードに送信されるので、どのシャードに存在するかや_version_の値は問題にならないはずです。

ありがとう、
Shawn

返信投稿者:ks-solruserml-bot (2024/09/11 21:52 投稿)

Shawn、ご指摘ありがとうございます。

すでにあなたが共有してくださった懸念事項は考慮しましたが、それでも_version_を使用してドキュメントを削除したり、クエリを実行したりする方法が見つかりませんでした。

クエリリクエストと削除リクエストの間に、ドキュメントを更新する可能性のある何かが動作していませんか?
いいえ、インデックス作成は実行されていませんでした。クエリを行う前に、すべての変更をコミットしました。そのため、クエリと削除の間にドキュメントが更新された可能性はないと確信しています。

同じuniqueKey値を複数のシャードに持つドキュメントがありますか?
いいえ、同じユニークキーを持つドキュメントが複数のシャードに存在することはありません。削除しようとしていたドキュメントが単一のシャードに存在していることを確認しました(各シャードごとにルーティングリクエストを行い、ドキュメントが存在するかを確認しました。例: _route_:shard1)。

ドキュメントに一致するクエリを実行すれば、_version_フィールドが検索結果に表示されるはずです。複数のシャードに同じuniqueKey値を持つドキュメントがある場合、どのドキュメントが返されるかは予測できません。Solrは結果を返す際に重複を排除するので、各uniqueKeyフィールドの値に対して一つのドキュメントしか返されません。
以下のクエリを使用して_version_フィールドを抽出しました:
fq=uniqueid:{some_value}&fl=_version_
しかし、この抽出したバージョンを使用してフィルタークエリを実行したところ(例: fq=_version_:{extracted_version})、ドキュメントが見つかりませんでした。

暗黙のルーターを使用している場合、単にdeleteByIdを使用してuniqueKeyフィールドの値を指定すれば、削除リクエストはすべてのシャードに送信されるので、どのシャードに存在するかや_version_の値は問題にならないはずです。
はい、_version_なしでドキュメントを削除することは可能ですが、なぜ_version_を指定した削除リクエストが失敗するのか、依然として疑問に思っています。

返信投稿者:ks-solruserml-bot (2024/09/11 21:52 投稿)

これは私のインデックスでの_version_フィールドの定義です。おそらく、すべてのSolrサンプル設定でこのように定義されていると思います。

<field name="_version_" type="long" indexed="false" stored="false"/>

この定義におけるindexed="false"は、そのフィールドに対するクエリが不可能であることを意味します。私は、このフィールドがその機能のためにクエリを必要としないため、またインデックスを少し小さくするために、サンプル設定ではインデックス化されていないのではないかと考えています。

stored="false"が設定されていると、検索結果に返されないと思われるかもしれませんが、そのタイプのフィールドにはデフォルトでdocValuesが定義されており、docValuesの機能により、デフォルトで検索結果に値が提供されます。

なぜあなたが_version_フィールドで不一致に遭遇しているのかはわかりません。それは非常に奇妙に思えます。

ありがとうございます。
Shawn

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?