使用布尔运算符进行Solr通配符搜索

时间:2013-01-31 16:34:00

标签: solr

我正在尝试使用布尔运算符运行一些通配符搜索。当我运行以下查询时,我得到了适当的结果: -

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* *:*)

但是,有没有办法在不将我的短语分成单个单词的情况下完成相同的操作?

1 个答案:

答案 0 :(得分:0)

你这么说:

field1:*val1 val2*

搜索任何东西都是val1和val2都会发生。除非您自己实现了这种语法,否则我无法在Lucene或Solr中找到任何此类语法的文档。它应该搜索:

field1:*val1 OR defaultfield:val2*

如果你想在field1中搜索两者的存在(不确定你打算为通配符做什么,但暂时离开它们):

field1:(+*val1 +val2*)

此外,-field3:(*val1 val2* *:*)表示您将省略包含*val1val2**:*的所有结果,并且最后我读到包含冒号的内容,而我我不确定它是否能正常工作。

field1:(*val1 AND val2*) AND field2:val3 AND -field3:(*val1 val2* *:*)

或者(因为我必须首先提供我首选的查询语法):

+field1:(+*val1 +val2*) +field2:val3 -field3:(*val1 val2* *:*)
相关问题