Solr NGramTokenizerFactory和PatternReplaceCharFilterFactory - 分析器结果与查询结果不一致

时间:2011-06-23 19:40:58

标签: regex solr n-gram

我目前正在使用我(错误地)认为是Solr的NGramTokenizerFactory的相当简单的实现,但是我得到了管理分析器和实际查询结果之间不一致的奇怪结果,我是希望得到一些指导。

我正在尝试获取用户输入以匹配我的NGram(minGramSize = 2,maxGramSize = 2)索引。我的索引和查询时间模式如下:

  1. 我使用PatternReplaceCharFilter删除所有非字母数字字符。
  2. 我使用NGramTokenizerFactory进行标记。
  3. 我使用LowerCaseFilterFactory小写(这会留下非字母代币,所以我的数字会保留)。
  4. 使用下面的模式,我认为搜索“PCB-1260”(带有正确转义的短划线)应该与索引的Ngram标记化和小写的“Arochlor-1260”值匹配(即,1260的bigrams是索引值和查询值中的“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>
    

1 个答案:

答案 0 :(得分:0)

所以 - 对于PatternReplaceCharFilter在查询时无法删除破折号,某些东西肯定很奇怪。最后,我只是在发送到Solr之前用preg_replace在用户输入的php中进行了一些预查询处理,并且 - 中提琴! - 像预期结果的魅力一样工作。令人费解的是PatternReplaceCharFilter没有表现......

这是我用来摆脱破折号的预查询php代码,如果有人需要的话。

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

在那之后,我刚刚将$ res传递给Solr ......