Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lucene 解决方案:NGramFilterFactory的问题_Lucene_Solr_N Gram - Fatal编程技术网

Lucene 解决方案:NGramFilterFactory的问题

Lucene 解决方案:NGramFilterFactory的问题,lucene,solr,n-gram,Lucene,Solr,N Gram,我正在运行SOLR作为一个内联网的搜索引擎,内联网有40000多个文档。我使用copyField指令将标题和关键字字段复制到内容字段,并仅为其编制索引,从而使操作非常简单 从现在起,我们使用此配置: <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory" /> <filter class="solr.WordDelimiterFilterFactory" g

我正在运行SOLR作为一个内联网的搜索引擎,内联网有40000多个文档。我使用copyField指令将
标题
关键字
字段复制到
内容
字段,并仅为其编制索引,从而使操作非常简单

从现在起,我们使用此配置:

<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>
现在的问题是:使用旧配置,我通常会找到7个带有特定关键字(“Sony”)的文档。现在,只有两个。我完全刷新了索引并从头开始构建它。当我再次取出该行并重新编制文档索引时,它会再次按预期工作。这就引出了我的问题:

  • FilterFactory是适合我的,还是应该是tokenizer工厂?如果标记器:它能在过滤器之后运行吗
  • 我将这些文档作为xml添加到75个文档中,并在最后进行提交。应该有更多的承诺吗
  • 还有一个我现在忘了。。grr

提前谢谢

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

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

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

只是一个猜测-

内容字段的大小(字数)是多少?
现在,您已经将NGramFilterFactory放入了minGramSize为3的过滤器链中,许多令牌将被生成,并且都位于一个新的位置

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

<maxFieldLength>10000</maxFieldLength>
10000

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

一个很好的“猜测”。提高限额起到了作用。您知道是否可以检查索引中有多少令牌吗?您可以检查索引中的术语。不确定是否可以检查文档和特定字段。试试luke工具,它可能会对您有所帮助。我检查了该工具的结果,但没有发现错误。由贾扬德拉·帕蒂尔(Jayendra Patil)提出的增加maxFieldLength完成了这项工作。谢谢你的回答!
<maxFieldLength>10000</maxFieldLength>