【问题标题】:Solr and search operators - lucene apache solrSolr 和搜索运算符 - lucene apache solr
【发布时间】:2014-05-26 07:36:26
【问题描述】:

我遇到了搜索运算符“*”(星号)的问题

我的情况是:

我搜索了一些文档字段(它是动态字段:

<fieldType name="bwcm_string" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <!-- <tokenizer class="solr.StandardTokenizerFactory"/> -->
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ReversedWildcardFilterFactory" />
   </analyzer>
  <analyzer type="query">
   <!-- <tokenizer class="solr.StandardTokenizerFactory"/> -->
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

)

<dynamicField name="*_STRING"  type="b_string"  indexed="true"  stored="true" multiValued="false"/>

我使用查询“*\”进行搜索,并使用“*B*”按动态字段查询过滤器,然后返回 只有字段包含“B Bug”的文档,还有其他文档的字段包含 A Bug,在这种情况下也应该返回它们。 有什么建议吗?

谢谢

【问题讨论】:

    标签: java apache solr lucene


    【解决方案1】:

    根据您的描述,不太清楚您的查询是"*B*" 还是*B*,但我猜是前者。

    在这种情况下,您的查询是针对短语*B*,也就是说,星号不会被解释为查询运算符。它们是正在搜索的术语的一部分。由于您使用的是LowercaseTokenizer,它实际上是LetterTokenizerLowercaseFilter 的组合(顺便说一句,在LowercaseTokenizer 后面加上LowercaseFilter 是多余的),任何非字母都将从查询,意味着您的有效查询很简单:B

    相反,只需搜索 *B*。您可能需要在查询解析器上setAllowLeadingWildcard(true)。不过,鉴于所提供的案例,只需 B* 就足够了(并且性能会更好)。

    【讨论】:

    • 我更改了该字段的定义,如您所见 - 现在我遇到了仅搜索以 B* 开头的字段的问题,这不起作用
    • 好吧,你为什么把它改成使用KeywordTokenizer
    • 我改变了这一点,因为索引字段值被拆分,并且使用这个标记器使值只是一个大字符串。在之前的介绍中是一个错误。 solr reindex 后,搜索运算符 * 第一眼就可以正常工作。我稍后会对此进行测试。
    【解决方案2】:

    我认为你需要的是ReversedWildcardFilterFactory

    看起来您的确切用例在此处描述:Wildcard queries and how Solr handles them

    【讨论】:

    • 我更改了该字段的定义,如您所见 - 现在我遇到了仅搜索以 B* 开头的字段的问题,这不起作用
    • 您使用的是 KeywordTokenizerFactory,有什么原因吗?使用“A Bug”的当前设置,您将获得以下标记:“gub a”、“a bug”。使用 StandardTokenizerFactory,您将获得:“a”、“bug”、“gub”和对“B”的查询应该可以工作 :) 尝试使用“hostname:8983/solr/#/core_name/analysis”来预测字段将如何处理
    • 嗯,你为什么认为我从“a bug”中得到了“bug a”之类的标记——这是两个不同的标记——cwiki.apache.org/confluence/display/solr/… 无论如何,乍一看,现在它可以正常工作了,我会继续测试
    • 我提到索引“A Bug”会给你:“gub a”,“a bug”(假设你将使用我提到的过滤器)。我不会使用 KeywordTokenizerFactory,因为它适用于精确匹配,而不适用于任何类型的模糊匹配
    • 感谢您的回复。对我来说这就足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2010-11-26
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多