我正在尝试使用布尔运算符运行一些通配符搜索。当我运行以下查询时,我得到了适当的结果: -
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和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* *:*)
但是,有没有办法在不将我的短语分成单个单词的情况下完成相同的操作?
答案 0 :(得分:0)
你这么说:
field1:*val1 val2*
搜索任何东西都是val1和val2都会发生。除非您自己实现了这种语法,否则我无法在Lucene或Solr中找到任何此类语法的文档。它应该搜索:
field1:*val1 OR defaultfield:val2*
如果你想在field1中搜索两者的存在(不确定你打算为通配符做什么,但暂时离开它们):
field1:(+*val1 +val2*)
此外,-field3:(*val1 val2* *:*)
表示您将省略包含*val1
,val2*
或*:*
的所有结果,并且最后我读到包含冒号的内容,而我我不确定它是否能正常工作。
field1:(*val1 AND val2*) AND field2:val3 AND -field3:(*val1 val2* *:*)
或者(因为我必须首先提供我首选的查询语法):
+field1:(+*val1 +val2*) +field2:val3 -field3:(*val1 val2* *:*)