Solr (3.3) では、フィールドを文字単位で検索可能にし、EdgeNGramFilterFactory
フレーズ クエリにも対応させることはできますか?
たとえば、「contrat informatique」が含まれている場合、ユーザーが次のように入力すると見つかるフィールドを探しています。
- 契約
- 情報
- 制御
- 情報
- 「契約情報」
- 「契約情報」
現在、私は次のようなものを作りました:
<fieldtype name="terms" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldtype>
...しかし、フレーズクエリでは失敗しました。
solr admin のスキーマ アナライザーを見ると、「contrat informatique」によって次のトークンが生成されていることがわかります。
[...] contr contra contrat in inf info infor inform [...]
そのため、クエリは "contrat in" (連続したトークン) では機能しますが、"contrat inf" では機能しません (この 2 つのトークンが分離されているため)。
あらゆる種類のステミングがフレーズ クエリで機能すると確信していますが、EdgeNGramFilterFactory
.