我正在尝试使用布尔运算符运行一些通配符搜索。当我运行以下查询时,我得到了适当的结果:-
q=field1:*val1 val2* AND field2:val3
上面显示了在 field1 中以任意组合出现 val1 和 val2 且 field2 包含值 val3 的所有记录。
但是,如果我运行以下查询:-
q=field1:*val1 val2* AND field2:val3 AND -field3:(*val1 val2* *:*)
field1 搜索开始表现异常。据我了解 debugQuery 结果,上述查询首先搜索那些在 field1 中出现 val1 或 val2(或两者)的记录,通过 field2 过滤它,然后过滤那些 field3 不包含val1 和val2。因此,此查询可以显示字段 1 中存在 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* *:*)
但是,有没有办法在不将我的短语分成单个单词的情况下完成相同的操作?