ブール演算子を使用してワイルドカード検索を実行しようとしています。次のクエリを実行すると、適切な結果が得られます:-
q=field1:*val1 val2* AND field2:val3
上記は、val1 と val2 が任意の組み合わせで field1 に出現し、field2 に値 val3 が含まれるすべてのレコードを表示します。
ただし、次のクエリを実行すると:-
q=field1:*val1 val2* AND field2:val3 AND -field3:(*val1 val2* *:*)
field1 検索の動作がおかしくなり始めます。私が debugQuery の結果を理解している限り、上記のクエリは、最初に val1 または val2 (または両方) が field1 に表示されるレコードを検索し、field2 でフィルター処理してから、field3に val1 と val1の組み合わせが含まれていないレコードをフィルター処理します。 val2。したがって、このクエリは、field1 に val2 (val1 ではなく) が存在するレコードを表示できます。
field1でも近接検索を試みました。無効。ただし、後で、近接検索はワイルドカードでは機能しないことを知りました。
上記のフィールドは次のように定義されています:-
<field name="field1" type="text_general" indexed="true" stored="false" multiValued="true" />
<field name="field2" type="text_general" indexed="true" stored="false" />
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<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>
<analyzer type="select">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
field3 は文字列であり、問題はありません。上記のクエリを変更して、field1 を検索すると、val1 と val2 の両方が存在するレコードのみが返されるようにすることはできますか (任意の組み合わせが許容されます)。
更新:次のことを行ったときに機能しました:-
q=field1:*val1 AND field1:val2* AND field2:val3 AND -field3:(*val1 val2* *:*)
しかし、私のフレーズを個々の単語に切り刻むことなく、同じことを達成する方法はありますか?