使用SOLR搜索简短的单词

时间:2010-06-11 08:16:42

标签: lucene solr

我正在使用SOLR和NGramTokenizerFactory来帮助创建单词子串的搜索令牌

NGramTokenizer配置的最小字长为3

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

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

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

我该怎么做?

/卡斯滕

2 个答案:

答案 0 :(得分:6)

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

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

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

那么为什么不在没有该分析器的情况下将该术语复制到另一个领域呢?

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

我希望这在某种程度上帮助了你。

聚合和复制域属性的一些链接:

Indexing data in multiple fields

Using copy field tag

答案 1 :(得分:0)

我遇到了一个类似的问题,我试图保持简短的单词而不创建巨大的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"/>