我正在将SOLR用作具有超过40000个文档的Intranet的搜索引擎。通过使用copyField指令将titlekeywords字段复制到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个。我完全刷新了索引并从头开始构建它。当我再次取出该行并为文档重新编制索引时,它又可以按预期工作。这使我想到了以下问题:
  • 是FilterFactory对我来说是正确的事情,还是应该是令牌生成器工厂?如果是分词器:它可以在过滤器之后运行吗?
  • 我将75份文档中的xml文档添加为xml,并在最后完成提交。是否应该有更多提交?
  • 我现在忘记了另一个.. grr

  • 提前致谢!

    最佳答案

    只是一个疯狂的猜测-

    您的内容字段的大小(字数)是多少?
    这样,既然您将NGramFilterFactory放入了具有3的minGramSize的过滤器链中,将要生成很多令牌,并且所有令牌都位于一个新位置。

    solrconfig.xml中的maxFieldLength设置限制要索引的令牌数。
    默认值为10000(仍然很高),但是如果内容较大且过滤器链中包含ngramfilter,则可以超过默认值。

    <maxFieldLength>10000</maxFieldLength>
    

    尝试将此值增加到一个较高的数字,重新索引并检查是否找到匹配项。

    10-06 11:04