3

40000 を超えるドキュメントを含むイントラネットの検索エンジンとして SOLR を実行しています。copyField ディレクティブを使用してtitlekeywordsフィールドをフィールドにコピーし、そのフィールドcontentのみにインデックスを付けることで、非常にシンプルにしています。

今から、この構成を使用していました:

<analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory" />              
    <filter class="solr.SnowballPorterFilterFactory" language="German" />
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>

それはかなりうまくいきましたが、ワイルドカードを手動で設定しなければならないという不満がありました。そこでNGRamFilterFactory、アナライザーの最後の行として追加しました。

<analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory" />              
    <filter class="solr.SnowballPorterFilterFactory" language="German" />
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="30" />
</analyzer>

問題は次のとおりです。古い構成では、特定のキーワード(「Sony」)で7つのドキュメントを見つけていました。現在、2 つしかありません。インデックスを完全にフラッシュし、最初から作成しました。その行を再度取り出してドキュメントのインデックスを再作成すると、再び期待どおりに機能します。それは私が持っている質問に私を導きます:

  • FilterFactory は私にとって正しいものですか、それともトークナイザーファクトリーであるべきですか? トークナイザーの場合: フィルターの後に実行できますか?
  • ドキュメントを xml として 75 個のドキュメントのトランシェに追加し、最後にコミットします。もっとコミットするべきですか?
  • 私が今忘れていたもう一つがありました.. grr

前もって感謝します!

4

2 に答える 2

5

ただの野蛮な推測-

コンテンツフィールドのサイズ(単語数)はいくつですか?
これで、minGramSizeが3のNGramFilterFactoryがフィルターチェーンに組み込まれたので、多くのトークンが生成され、すべて新しい位置に配置されます。

solrconfig.xmlのmaxFieldLength設定は、インデックス付けされるトークンの数を制限します。
デフォルト値は10000(まだ高い)ですが、フィルターチェーン内の大きなコンテンツとngramfilterで超える可能性があります。

<maxFieldLength>10000</maxFieldLength>

この値を大きくして、インデックスを再作成し、一致するものが見つかるかどうかを確認してください。

于 2011-10-13T19:41:01.197 に答える
2

Field Analysis Debuggingツールを使用することを強くお勧めします。これは、Solr Admin サイトからアクセスできます ([Config] の横にある [Analysis] リンクをクリックします)。これは非常に強力なツールで、テキスト値がどのように単語に分解されるかを確認し、チェーン内の各フィルターを通過した後の結果のトークンを表示します。

このツールを使用すると、"Sony" をクエリしたときに返されないドキュメントの 1 つを取得し、インデックスを作成するテキストをインデックス フィールドに貼り付け、sony をクエリ フィールドに貼り付けて、Solr がフィルターを適用してクエリを実行する方法を確認できます。一致するそのフィールド。次に、スキーマを NGramFilterFactory を使用せずに元の状態に戻し、元のドキュメントがどのように分類され、照合されたかを確認して、NGramFilterFactory がインデックスとクエリにどのように影響したかを比較できます。

小さい検索結果は、NGramFilterFactory 設定で指定した minGramSize および maxGramSize 設定に基づいている可能性があります。これらがインデックス作成に与える影響の詳細については、Solr WikiのNGramFilterFactoryドキュメントを参照してください。

于 2011-10-13T13:10:31.013 に答える