Solrがアトミックインデックス作成中に未知のフィールドについて苦情を言う

トピック作成者:ks-solruserml-bot (2024/05/23 12:43 投稿)
2
CloseClose

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

アトミックインデックス作成を行っている際に、スキーマに指定されていないフィールドX(これは廃止されたフィールド)について「未知のフィールドX」というエラーが発生します。そのフィールドをスキーマから削除した後、Solrを再起動しましたが、コンテンツを再インデックス化していないため、削除されたフィールドのデータがまだSolrインデックスに存在する可能性があります。

私が理解するアトミックインデックス作成の仕組みでは、すべての保存された値を再インデックスしようとしますが、なぜ存在しないフィールドの保存された値をインデックスしようとするのでしょうか?

返信投稿者:ks-solruserml-bot (2024/05/23 12:44 投稿)

Solrのアトミックアップデート機能は、既存のドキュメント全体を取得し、そのドキュメントに対してアトミックアップデートの指示を実行し、その結果を新しいドキュメントとしてインデックスする仕組みです。ユニークキー機能が有効になっている場合(アトミックアップデートが正しく機能するために必要です)、新しいドキュメントが追加されると同時に古いドキュメントが削除されます。コードを確認したわけではありませんが、既存のフィールドはスキーマを参照することなく、一度にドキュメントに追加されている可能性が高いです。そのため、フィールドXがインデックス内の既存ドキュメントに含まれている場合、新しいドキュメントにも含まれることになります。Xがスキーマから削除されている場合、あなたが遭遇したエラーが発生します。

アトミックアップデートにスキーマを考慮させることは、それなりの作業が必要です。不可能ではありませんが、少し時間がかかります。Solr開発者としては、このような状況でインデックス作成が失敗するようにしたいと考えています。失敗は現在よりもコードの異なる場所、アトミックドキュメントの組み立て中に発生するようになります。つまり、早めに、そして迅速に失敗するということです。

この状況に対処するためには、フィールドXをスキーマに残しておき、インデックス作成時に完全に無視されるタイプに変更する必要があります。

例えば、以下のようにします:

<fieldType
name="ignored"
indexed="false"
stored="false"
docValues="false"
multiValued="true"
class="solr.StrField" />

次に、すべての未知のフィールドを処理するために以下を追加します:

<dynamicField name="*" type="ignored" multiValued="true" />

または、個々のフィールドをこのように名前付けすることもできます。この方法は、ワイルドカードの動的フィールドよりも良いオプションだと思います。

設定スニペットの出典:
https://stackoverflow.com/questions/46509259/solr-7-managed-schema-how-to-ignore-unnamed-fields

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

返信投稿者:ks-solruserml-bot (2024/05/23 12:44 投稿)

少し補足しますが、もしネストされたドキュメントも使用している場合は、「*」のワイルドカードではなく、個々のフィールド名を優先して使用するべきです。そうしないと、ネストされた子ドキュメントが消える原因となる次のバグに遭遇する可能性があります: https://issues.apache.org/jira/browse/SOLR-15018

よろしく、
Andreas

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

KandaSearch

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

投稿の削除

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