【问题标题】:Solr Search for near matchesSolr 搜索近似匹配
【发布时间】:2014-02-05 12:08:51
【问题描述】:

嗨,我想在 solr 中搜索近似匹配项,我的意思是如果我查询“manage”,那么它应该寻找“manager”、“management”等,而不是“man”。我目前正在使用与我不想要的完全匹配的字符串字段。请建议一些过滤器或分析器,我可以通过它们来实现这一点。在此先感谢。

【问题讨论】:

  • 您在寻找前缀搜索吗?
  • Ya 前缀搜索。我不想在查询中给出 q=manage*,而是想在模式本身中执行它,以便它以这种方式搜索。

标签: solr


【解决方案1】:

您需要查看stemming。根据您需要处理的语言,有不同的分析器。

【讨论】:

    【解决方案2】:

    如果对使用 Solr 分析器的要求不高,您可以通过使用通配符 '*' 字符来简单地实现上述搜索结果。

    例如:假设架构中的字段名称是“foo”,其值为“b”、“ba”、“bar”、“bart”、“bartender”和“foobar”。要搜索所有带有“bar”的值,您可以简单地查询如下。

    q=foo:(bar*)
    

    以上查询将返回“bar”、“bart”和“bartender”。希望这就是你要找的。

    更新:

    而且,如果您需要使用 Solr 分析器和过滤器,那么 solr.EdgeNGramFilterFactory 就是您应该寻找的过滤器工厂。

    此 FilterFactory 在查询期间匹配索引中特定术语的前缀子字符串(或后缀子字符串,如果 side="back")非常有用。边缘 n-gram 分析可以在索引时或查询时(或两者)执行,但通常更有用,如本示例所示,在索引时生成 n-gram,所有 n-gram 都在相同的位置。在查询时,查询词可以直接匹配,无需任何 n-gram 分析。与通配符不同,n-gram 查询词可以在引用的短语中使用。

    http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory

    检查下面 schema.xml 的字段类型定义。

    <fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
       <analyzer type="index">
          <tokenizer class="solr.LowerCaseTokenizerFactory"/>
          <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
       </analyzer>
       <analyzer type="query">
          <tokenizer class="solr.LowerCaseTokenizerFactory"/>
       </analyzer>
    </fieldType>
    

    希希尔

    【讨论】:

    • 嘿 Shishir,是的,我可以这样做,但我不想提供 bar*,而是只提供 bar,这样它就会自行搜索 bar、bart、bartender 等单词。
    • Madhur,我已经用 solr 过滤器更新了我的答案。
    • 好吧,在这种情况下,您能否将其标记为答案并帮助其他人?提前致谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2015-11-27
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多