0

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

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

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

4

1 回答 1

1

你说:

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* *:*)
于 2013-01-31T17:09:15.090 回答