私は現在、Solrのかなり単純な実装であると(誤って)考えていたものを使用していますNGramTokenizerFactory
が、管理アナライザーと実際のクエリ結果の間で一貫性のない奇妙な結果が得られており、いくつかのガイダンスを期待しています。
NGram(minGramSize = 2、maxGramSize = 2)インデックスに一致するユーザー入力を取得しようとしています。インデックス作成とクエリ時間のスキーマは次のとおりです。
- を使用して、英数字以外のすべての文字を削除し
PatternReplaceCharFilter
ます。 - でトークン化し
NGramTokenizerFactory
ます。 - 私は小文字を使用して
LowerCaseFilterFactory
います(これにより、文字以外のトークンがそのまま残るため、番号は残ります)。
以下のスキーマを使用すると、「PCB-1260」(適切にエスケープされたダッシュ付き)の検索は、「Arochlor-1260」のインデックス化されたトークン化された小文字の値と一致する必要があると思います(つまり、1260のバイグラムは「1226」です。インデックス値とクエリ値の両方で60")。
残念ながら、ダッシュを削除しないと結果が得られません。[編集-ダッシュを適切にエスケープしてクエリに残しても、結果は得られません]。-を使用してすべての英数字を完全にパターン置換しているため、これは奇妙に思えPatternReplaceCharFilter
ます。これにより、すべての空白とダッシュが削除されると思います。
管理ページのクエリアナライザは、以下のスキーマを使用して適切な一致を示しています-そのため、私は少し途方に暮れています。私がここで見逃している 、PatternReplaceCharFilter
またはについての基本的な何かがありますか?NGramTokenizerFactory
コードや他の投稿を確認しましたが、これを理解できないようです。壁に頭をぶつけて1週間後、これをスタックの権限に提出します。
<fieldtype name="tokentext" class="solr.TextField" positionincrementgap="100">
<analyzer type="index">
<charfilter class="solr.PatternReplaceCharFilterFactory" pattern="([^A-Za-z0-9])" replacement=""/>
<tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<charfilter class="solr.PatternReplaceCharFilterFactory" pattern="[^A-Za-z0-9]" replacement=""/>
<tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>