3

我正在运行 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 对我来说是正确的还是应该是标记器工厂?如果分词器:它可以在过滤器之后运行吗?
  • 我在 75 个文档中将文档添加为 xml,并在最后进行提交。是否应该有更多的提交?
  • 还有一个我现在忘记了.. grr

提前致谢!

4

2 回答 2

5

只是一个疯狂的猜测-

您的内容字段的大小(字数)是多少?
因为,既然您已经将 NGramFilterFactory 放入您的过滤器链中,并且 minGramSize 为 3,那么将生成很多令牌并且所有令牌都在一个新位置。

solrconfig.xml 中的 maxFieldLength 设置限制了要索引的标记数。
默认值是 10000(仍然很高),但在过滤器链中的大内容和 ngramfilter 可以超过。

<maxFieldLength>10000</maxFieldLength>

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

于 2011-10-13T19:41:01.197 回答
2

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

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

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

于 2011-10-13T13:10:31.013 回答