Solr 9.8.1 にアップグレードした後、ファセットが空になる問題のヘルプ | KandaSearch Community Support Forum

Solr 9.8.1 にアップグレードした後、ファセットが空になる問題のヘルプ

トピック作成者:ks-solruserml-bot (2025/10/24 18:12 投稿)
5
OpenOpen

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

こんにちは Solr コミュニティの皆さん、

私は Solr 8 から Solr 9.8.1 へアップグレードした後に直面した問題について、理解するために助けを求めています。アップグレード以降、インデックスされたデータは残っているにもかかわらず、ファセットクエリが空の結果を返すようになりました。

また、移行の一環としてスキーマバージョンを 1.7 にアップグレードしました。最も重要な変更点は、以前は Solr 8 でファセットをサポートしていた 2 つのカスタム solr.TextField ベースのフィールドタイプが、Solr 9.8.1 ではもはやサポートしなくなったように見えることです。

以下が問題を引き起こしているフィールドタイプ定義です:

<fieldType name="kwd" stored="true" indexed="true" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory" />
  </analyzer>
</fieldType>

<fieldType name="payloads" stored="true" indexed="true"
           class="solr.TextField" positionIncrementGap="1000">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.DelimitedPayloadTokenFilterFactory"
            encoder="float" delimiter=":"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  </analyzer>
</fieldType>

これらのフィールドは Solr 8 ではファセットに問題なく利用できていました。
そこで質問なのですが、この問題を経験した方はいらっしゃいますか?あるいは、Solr 9.x で TextField タイプのファセットに影響する変更があったのでしょうか?
ファセット機能を復旧させるために推奨される代替手段や調整方法があれば教えていただきたいです。

あらかじめありがとうございます。
Vincenzo D'Amore

返信投稿者:ks-solruserml-bot (2025/10/24 18:12 投稿)

これはフィールド定義における「uninvertible」プロパティが原因かもしれません。最近の Solr バージョンでは、このプロパティのデフォルト値が true から false に変更されました(正確にどのバージョンからかは分かりません)。

パフォーマンスの観点からは、ファセットやソートには string フィールドのような docValues 対応フィールドを使用する方がはるかに優れています。元の text フィールドを保持したまま、copyField 定義を使って新しい string フィールドにコピーすることも可能です。あるいは、docValues を使うことによるパフォーマンス上の利点を気にしないのであれば、uninvertible を true に設定して再インデックスすることもできます。

—Ufuk

返信投稿者:ks-solruserml-bot (2025/10/24 18:12 投稿)

ufukさん、返信ありがとうございます。
問題にできるだけ早く対処するために、とりあえず facet.method=enum を追加しましたが、あなたの提案の方がより効果的に思えます。

ただ、それをどう実装すればいいのかはよく分かりません。
私の理解が正しければ、値が solr.TextField で analyze/tokenize された後に、string/strings フィールドへコピーされる、ということで合っていますか?

--
Vincenzo D'Amore

返信投稿者:ks-solruserml-bot (2025/10/24 18:12 投稿)

solr.TextField で処理されてから string/strings フィールドにコピーされる、という理解で合っていますか?

そうではありません。copyField ディレクティブは、インデックス作成時に入力された 生データ を別のフィールドにコピーします。そのフィールドは全く異なるタイプ、アナライザ、トークナイザを持つことができます。テキスト処理はその後で行われます。

もしコピー先のフィールドが docValues をサポートするものであれば(例:string)、そのフィールドでのファセットやソートははるかに効率的になります。
通常は、検索は元のフィールドで行い、ファセットやソートはコピー先のフィールドで行う、という方法をとります。繰り返しになりますが、これは docValues による性能向上を気にする場合のみ 実装する価値があります。

あなたの元々の問題を解決するだけなら、uninvertible=true を追加して再インデックスすれば十分だと思います。

—Ufuk

返信投稿者:ks-solruserml-bot (2025/10/24 18:13 投稿)

スキーマ v1.7 では新しい挙動があります
\==> docValues はデフォルトで true、uninvertible はデフォルトで false になりました。私が追えた限りでは、この変更は Solr 9.7 で導入されたようです。

TextField はもともと docValues=false なので、あなたが直面している挙動は uninvertible=false がデフォルトになったこと によるはずです。

解決策としては、再インデックスを検討し、ファセットが必要な 非プリミティブフィールド については明示的に uninvertible=true を設定する必要があるかもしれません。
一方で、プリミティブフィールドは schema v1.7 でデフォルトが docValues=true になり、引き続きファセットをサポートします。

もし再インデックスをしたくないのであれば、スキーマ v1.6 に戻すという手もあります。

—Rahul

返信投稿者:ks-solruserml-bot (2025/10/24 18:13 投稿)

Ufukさん、Rahulさん、サポートありがとうございます。
私のコレクションはかなり小さい(10万件のドキュメント)ので、uninvertible=true を追加して全ドキュメントを再インデックスしたところ、うまくいきました。
これくらい小さいインデックスなら、パフォーマンスも依然として良好です。

よろしくお願いします。
Vincenzo

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

KandaSearch

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

投稿の削除

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