我正在将SOLR用作具有超过40000个文档的Intranet的搜索引擎。通过使用copyField指令将title
和keywords
字段复制到content
字段并仅对其进行索引,我使它非常简单。
从现在开始,我们就使用以下配置:
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" language="German" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
效果很好,但是有人抱怨说通配符必须手动设置。因此,我在分析器的最后一行添加了
NGRamFilterFactory
:<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.SnowballPorterFilterFactory" language="German" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="30" />
</analyzer>
现在的问题是:使用旧的配置,我曾经用某个关键字('Sony')查找7个文档。现在只有2个。我完全刷新了索引并从头开始构建它。当我再次取出该行并为文档重新编制索引时,它又可以按预期工作。这使我想到了以下问题:
提前致谢!
最佳答案
只是一个疯狂的猜测-
您的内容字段的大小(字数)是多少?
这样,既然您将NGramFilterFactory放入了具有3的minGramSize的过滤器链中,将要生成很多令牌,并且所有令牌都位于一个新位置。
solrconfig.xml中的maxFieldLength设置限制要索引的令牌数。
默认值为10000(仍然很高),但是如果内容较大且过滤器链中包含ngramfilter,则可以超过默认值。
<maxFieldLength>10000</maxFieldLength>
尝试将此值增加到一个较高的数字,重新索引并检查是否找到匹配项。