あなたが求めていることを行う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 つの単語になります。となり、そして、なる。_a
b
d
catenateAll="1"
generateWordParts="0"
a
b
ab
a
b
d
abd
クエリのアナライザーは似ていますが、わずかな違いがあります。単語を破棄したり連結したりしないことを除いて、値を単語に分割します。代わりに、 and を受け取って, ShingleFilterFactory
, a
andb
を返すに単語を渡します。a
b
ab
連結の代わりに帯状疱疹を使用する理由は、 and の一致を可能にa b c
するためです。のみを一致させたい場合は、シングル ファクトリを設定および削除します。a b
b c
a b c
a b c
catenateAll="1"
この構成を使用すると、 、、および( ではない)a b
のみが一致します。また、、、、、、およびと一致します。も一致することに注意してください。これらのいずれかが必要でない場合は、必要なことを正確に実行するように shingle および word フィルター ファクトリを構成できるはずです。a
b
a b
a b d
a b c
a
b
c
a b
b c
a b c
ab
a b
編集:この回答の以前のバージョンでは、値の開始と終了をマークするために魔法の値が設定されていました。それは不要であることがわかりました。値を連結するだけでa b
、一致を防ぐことができa b d
ます。
編集 2 (インデックス アナライザーの修正):WhitespaceTokenizerFactory
されている必要がありますKeywordTokenizerFactory
。また、 がWordDelimiterFilterFactory
必要catenateAll="0"
です。