【问题标题】:Search for short words with SOLR使用 SOLR 搜索短词
【发布时间】:2010-06-11 08:16:42
【问题描述】:

我正在使用 SOLR 和 NGramTokenizerFactory 来帮助为单词的子字符串创建搜索标记

NGramTokenizer 配置为最小字长 3

这意味着我可以搜索例如“unb”,然后匹配单词“unbelievable”。

但是,我对“I”和“in”等短词有疑问。这些没有被 SOLR 索引(我怀疑这是因为 NGramTokenizer),因此我无法搜索它们。

我不想将最小字长减少到 1 或 2,因为这会创建一个巨大的搜索索引。但我希望 SOLR 包含长度已经低于此最小值的整个单词。

我该怎么做?

/卡斯滕

【问题讨论】:

    标签: lucene solr


    【解决方案1】:

    首先,试着理解为什么你的词没有被使用“分析工具”的 solr 索引

    http://localhost:8080/solr/admin/analysis.jsp
    

    只需输入您要搜索的字段和文本,然后查看哪个分析器正在过滤您的短期内容。我建议你这样做,因为你说你只有一个“嫌疑人”,你必须确定哪个分析器过滤了你的数据。

    那您为什么不直接将术语复制到另一个字段中而不使用该分析器呢?

    通过这种方式,您的术语将被索引两次,并且将同时显示为精确单词和 n-gram。 然后你要处理两个不同领域的分数。

    我希望这对您有所帮助。

    聚合和copyfield属性的一些链接:

    Indexing data in multiple fields

    Using copy field tag

    【讨论】:

    • 感谢您的建议。我对两个词进行了分析:一个正常的案例 - “jeudan”和一个字母的词“j”。这是结果pastie.org/1000520 如您所见,实际上是 NGramTokenizer 过滤掉了 1 个字母的单词 - 或者在这个 EdgeNGramTokenizer 中,但我已经对两者进行了测试。我可以尝试你的建议,但我更愿意让 Solr 完成所有的文本处理。我做了很多特定于字段的搜索,因此您的建议将导致需要重写这些查询以查看两个文本字段而不是一个。可能但违反直觉。
    • 请考虑在 solr 中通常有一个用于查询的聚合字段,然后是一系列具有不同类型和分析器的字段。只需使用 copyfield 标签将所有源字段复制到目标。您不必更改查询。
    • 好吧,您的回答实际上解决了我面临的这个问题和其他问题。我不知道分析工具。我最终通过分析器尝试了其他一些过滤器和标记器,并最终在索引和查询部分使用了PhoneticFilter。非常整洁 - 非常感谢!
    【解决方案2】:

    我只是遇到了一个类似的问题,我试图在不创建巨大的 solr 索引的情况下保持简短的单词。

    所以我想出了一个更简单的解决方案,不需要任何新字段或复制值:

      <!-- Keep small words safe from the n-gram filter -->
      <filter class="solr.PatternReplaceFilterFactory" pattern="^(.{2})$" replacement=" $1"/>
    
      <!-- Do the n-gramming -->
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25"/>
      <filter class="solr.ReverseStringFilterFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="25"/>
      <filter class="solr.ReverseStringFilterFactory"/>
    
      <!-- Remove the padding spaces -->
      <filter class="solr.TrimFilterFactory"/>
    

    这将为一个简短的单词添加足够的空格以使其到达minGramSize,并且由于它只有最小的大小,NGram-filter 将保持原样。

    如果需要,添加额外的PatternReplaceFilterFactory-filters。

    <!-- Protect single characters! (Two spaces) -->
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(.{1})$" replacement="  $1"/>
    

    【讨论】:

    • 哇! 9年后。我想 SO 问题永远不会过时。 :-)
    • 我对长词有疑问,您回答中的“maxGramSize”设置对我有帮助。就我而言,没有找到德语单词“Schwangerschaftsbeschwerden”,但“Schwangerschaftsbeschwerd”没问题! 25 是限制的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2011-12-03
    相关资源
    最近更新 更多