SOLR:NGramFilterFactory的问题

时间:2011-10-13 08:33:36

标签: lucene solr n-gram

我正在运行SOLR作为内部网的搜索引擎,只有超过40000个文档。我通过使用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>

现在的问题是:使用旧的配置我曾经找到7个带有特定关键字的文档('Sony')。现在,只有2.我完全刷新了索引并从头开始构建它。当我再次使用该行并重新索引文档时,它再次按预期工作。这引出了我的问题:

  • FilterFactory对我来说是对的,还是应该是tokenizer工厂?如果令牌化器:它可以在过滤器之后运行吗?
  • 我将文档作为xml添加到75个文档的部分中并在最后执行提交。应该有更多的提交吗?
  • 我忘记了另一个...... grr

提前致谢!

2 个答案:

答案 0 :(得分:5)

只是猜测 -

您的内容字段中的大小(字数)是什么? 因为,现在您将NGramFilterFactory放入过滤器链中,minGramSize为3,将生成许多令牌并且所有令牌都处于新位置。

solrconfig.xml中的maxFieldLength设置限制了要编制索引的令牌数量。
默认值为10000(仍然很高)但可以在过滤器链中使用大内容和ngramfilter时超出。

<maxFieldLength>10000</maxFieldLength>

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

答案 1 :(得分:2)

我强烈建议您使用Field Analysis Debugging工具。可以通过Solr Admin站点访问(单击[Config]旁边的[Analysis]链接)。这是一个非常强大的工具,您可以在其中查看文本值如何分解为单词,并在它们通过链中的每个过滤器后显示生成的标记。

使用此工具,您可以在查询“Sony”时获取一个未返回的文档,并将要编入索引的文本粘贴到索引字段中,将sony粘贴到查询字段中,以查看Solr如何应用您的过滤器然后查询该字段以查找匹配项。然后,您可以在没有NGramFilterFactory的情况下将架构更改回原始架构,并查看您的文档最初是如何分解和匹配的,以比较NGramFilterFactory如何影响索引和查询。

您较小的搜索结果可能基于您在NGramFilterFactory设置中指定的minGramSize和maxGramSize设置。请参阅Solr Wiki上的NGramFilterFactory文档,了解这些文档如何影响索引。