【问题标题】:Solr wildcard search with Boolean operator使用布尔运算符进行 Solr 通配符搜索
【发布时间】:2013-01-31 16:33:59
【问题描述】:

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

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 结果,上述查询首先搜索那些在 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* *:*)

但是,有什么方法可以在不将我的短语分解成单个单词的情况下完成相同的操作?

【问题讨论】:

    标签: solr


    【解决方案1】:

    你这么说:

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

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多