使用 SOLR 搜索短单词

问题描述 投票:0回答:3

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

NGramTokenizer 配置的最小字长为 3

这意味着我可以搜索例如“unb”,然后匹配“令人难以置信”一词。

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

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

我该怎么做?

/卡斯滕

lucene solr
3个回答
7
投票

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

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

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

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

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

我希望这对您有所帮助。

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

在多个字段中索引数据

使用复制字段标签


1
投票

我只是遇到了类似的问题,我试图在不创建巨大的 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 过滤器将保持原样。

如果需要,添加额外的

PatternReplaceFilterFactory
-过滤器。

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

0
投票

处于同样的情况,发现较新的 Solr 版本现在支持 Ngram 过滤器的

preserveOriginal
参数,默认设置为
false
。所以通过这个设置:

<filter class="solr.NGramFilterFactory"
    minGramSize="3"
    maxGramSize="15"
    preserveOriginal="true"/>

它将生成设定大小的 n-gram 标记,并保留 <3 and >15 个长标记,就像在命中 NGramFilterFactory 过滤器之前一样。

© www.soinside.com 2019 - 2024. All rights reserved.