我使用 SOLR 和 NGramTokenizerFactory 来帮助创建单词子串的搜索标记
NGramTokenizer 配置的最小字长为 3
这意味着我可以搜索例如“unb”,然后匹配“令人难以置信”一词。
但是我对“I”和“in”等简短单词有疑问。这些没有由 SOLR 索引(我怀疑这是因为 NGramTokenizer),因此我无法搜索它们。
我不想将最小字长减少到 1 或 2,因为这会创建一个巨大的搜索索引。但我希望 SOLR 包含长度已经低于此最小值的整个单词。
我该怎么做?
/卡斯滕
首先,尝试理解为什么你的单词没有被 solr 使用“分析工具”索引
http://localhost:8080/solr/admin/analysis.jsp
只需输入您要搜索的字段和文本,然后查看哪个分析器正在过滤您的短期术语。我建议您这样做,因为您说您只有一个“嫌疑人”,并且您必须确定哪个分析器过滤您的数据。
那么为什么不直接将术语复制到另一个字段而不使用该分析器呢?
通过这种方式,您的术语将被索引两次,并且将同时显示为精确单词和 n 元语法。 然后你就得处理两个不同领域的分数了。
我希望这对您有所帮助。
聚合和copyfield属性的一些链接:
我只是遇到了类似的问题,我试图在不创建巨大的 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"/>
处于同样的情况,发现较新的 Solr 版本现在支持 Ngram 过滤器的
preserveOriginal
参数,默认设置为 false
。所以通过这个设置:
<filter class="solr.NGramFilterFactory"
minGramSize="3"
maxGramSize="15"
preserveOriginal="true"/>
它将生成设定大小的 n-gram 标记,并保留 <3 and >15 个长标记,就像在命中 NGramFilterFactory 过滤器之前一样。