Solr的NGramTokenizerFactory和PatternReplaceCharFilte

2019-09-28 03:35发布

我目前使用的是什么我(错误地)以为会是一个相当简单的实现Solr的的NGramTokenizerFactory ,但我发现了奇怪的结果是管理员分析和实际查询结果之间的不一致,我希望获得一些指导。

我试图让用户输入符合我的NGRAM(minGramSize = 2,maxGramSize = 2)指数。 我的索引和查询时间模式如下,其中

  1. 我剥使用所有的非字母数字字符PatternReplaceCharFilter
  2. 我记号化与NGramTokenizerFactory
  3. 我用小写LowerCaseFilterFactory (这让非字母标记的地方,所以我的号码将保持)。

用下面的模式,我认为,对于“PCB-1260”的搜索(用正确转义横线),应符合“Arochlor-1260”的索引NGRAM记号化和小写的值(即,1260的双字母组是“12月26日在这两个索引值和所述询问值60" )。

不幸的是,我没有得到任何结果,除非我删除了冲刺。 [编辑 - 甚至当我正确转义破折号,让它在查询中,我还没有结果。 因为我正在做一个完整的图案更换使用所有字母数字字符这似乎很奇怪PatternReplaceCharFilter我以为删除所有空格和破折号- 。

在管理页面的查询分析器显示正确的匹配使用下面的模式 - 所以我在一个小的损失的。 是否有一些关于基本PatternReplaceCharFilterNGramTokenizerFactory说我在这里失踪?

我检查的代码和其他职位,但似乎无法推测这一个。 敲我的头撞在墙上的一个星期后,我提出这个堆栈的权威....

<fieldtype name="tokentext" class="solr.TextField" positionincrementgap="100">
    <analyzer type="index">
        <charfilter class="solr.PatternReplaceCharFilterFactory" pattern="([^A-Za-z0-9])" replacement=""/>
        <tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <charfilter class="solr.PatternReplaceCharFilterFactory" pattern="[^A-Za-z0-9]" replacement=""/>
        <tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldtype>

Answer 1:

这样的 - 我是PatternReplaceCharFilter未能在查询时删除破折号绝对奇怪。 最终,我只是做了一些查询预处理与preg_replace函数用户输入的PHP发送到Solr之前,和 - 中提琴! - 工作就像与预期结果的魅力。 令人费解的是,PatternReplaceCharFilter没有表现......

这里的预查询PHP代码,我曾经摆脱了短线的,如果有人需要它。

$pattern = '/([-])/';
$replacement = ' ';
$usrpar = preg_replace($pattern, $replacement, $raw_user_search_contents);
$res = htmlentities($usrpar, ENT_QUOTES, 'utf-8');

在那之后,我刚刚通过$水库到Solr ...



文章来源: Solr NGramTokenizerFactory and PatternReplaceCharFilterFactory - Analyzer results inconsistent with Query Results