SolrNet を使用して、.NET アプリケーションから Solr を検索しています。英単語を検索すると、すべてうまくいきます。しかし、 のようなスペイン語を使用するとespañol
、インデックスを作成したにもかかわらず、検索結果が得られません。Solr でデバッグしたところ、クエリが として解析されていることがわかりましたespaA+ol
。
UTF-8 エンコーディングを行う必要がありますか? それとも、SolrNet は ASCII 文字のみの検索をサポートしていますか?
SolrNet を使用して、.NET アプリケーションから Solr を検索しています。英単語を検索すると、すべてうまくいきます。しかし、 のようなスペイン語を使用するとespañol
、インデックスを作成したにもかかわらず、検索結果が得られません。Solr でデバッグしたところ、クエリが として解析されていることがわかりましたespaA+ol
。
UTF-8 エンコーディングを行う必要がありますか? それとも、SolrNet は ASCII 文字のみの検索をサポートしていますか?
これは SolrNet の問題ではなく、Solr が最初の 127 ASCII 文字セットにない文字を処理する方法に関連しています。最良の推奨事項は、ASCIIFoldingFilterFactoryを、スペイン語の単語を保存している Solr フィールドに追加することです。
text_general
例として、Solr の例で定義されているように fieldType を使用していた場合、schema.xml ファイルで次のように設定されます。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
次のように変更して、インデックス アナライザーとクエリ アナライザーに ASCIIFoldingFilterFactory を追加することをお勧めします。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
</fieldType>
また、変更をインデックスに反映するには、このスキーマの変更を行った後にデータのインデックスを再作成する必要があることに注意してください。
これらの文字をインデックスに具体的に保持するかどうかわからない場合は、必要がない場合は、次のようなものを使用することをお勧めします
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
したがって、「español」は「espanol」としてインデックス付けされ、それらのいずれかを検索すると「español」が見つかります(á、üなども同じです)。