あなたが求めていることを行う1つの方法は次のとおりです。
フィールドタイプ
<fieldType name="exact" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="0" catenateAll="1" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="1" catenateAll="0" />
<filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="" maxShingleSize="99"/>
</analyzer>
</fieldType>
説明:
インデックス アナライザーはWordDelimiterFilterFactory、フィールド値を単語に分割するために使用します。したがって、あなたの例を使用するとa b、単語aとbに分割され、、 、およびa b dに分割されます。設定すると、個々の単語が破棄され、1 つの単語になります。となり、そして、なる。_abdcatenateAll="1"generateWordParts="0"abababdabd
クエリのアナライザーは似ていますが、わずかな違いがあります。単語を破棄したり連結したりしないことを除いて、値を単語に分割します。代わりに、 and を受け取って, ShingleFilterFactory, aandbを返すに単語を渡します。abab
連結の代わりに帯状疱疹を使用する理由は、 and の一致を可能にa b cするためです。のみを一致させたい場合は、シングル ファクトリを設定および削除します。a bb ca b ca b ccatenateAll="1"
この構成を使用すると、 、、および( ではない)a bのみが一致します。また、、、、、、およびと一致します。も一致することに注意してください。これらのいずれかが必要でない場合は、必要なことを正確に実行するように shingle および word フィルター ファクトリを構成できるはずです。aba ba b da b cabca bb ca b caba b
編集:この回答の以前のバージョンでは、値の開始と終了をマークするために魔法の値が設定されていました。それは不要であることがわかりました。値を連結するだけでa b、一致を防ぐことができa b dます。
編集 2 (インデックス アナライザーの修正):WhitespaceTokenizerFactoryされている必要がありますKeywordTokenizerFactory。また、 がWordDelimiterFilterFactory必要catenateAll="0"です。