40000 を超えるドキュメントを含むイントラネットの検索エンジンとして SOLR を実行しています。copyField ディレクティブを使用してtitle
とkeywords
フィールドをフィールドにコピーし、そのフィールド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
前もって感謝します!