SOLR:NGramFilterFactory的问题

har*_*pax 3 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>
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但有人抱怨说,必须手动设置通配符.所以我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>
Run Code Online (Sandbox Code Playgroud)

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

  • FilterFactory对我来说是正确的,还是应该是tokenizer工厂?如果令牌器:它可以在过滤器之后运行吗?
  • 我将文档作为xml添加到75个文档的片段中,并在最后进行提交.应该有更多的提交吗?
  • 还有一个我现在忘记了......格尔

提前致谢!

Jay*_*dra 5

只是猜测 -

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

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

<maxFieldLength>10000</maxFieldLength>
Run Code Online (Sandbox Code Playgroud)

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