1

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

我试图让用户输入匹配我的 NGram (minGramSize=2, maxGramSize=2) 索引。我的索引和查询时间架构如下,其中

  1. 我使用删除所有非字母数字字符PatternReplaceCharFilter
  2. 我用 标记化NGramTokenizerFactory
  3. 我使用小写LowerCaseFilterFactory(保留非字母标记,所以我的数字将保留)。

使用下面的模式,我认为搜索“PCB-1260”(带有正确转义的破折号)应该匹配“Arochlor-1260”的索引 Ngram 标记和小写值(即 1260 的双元组是“12 26索引值和查询值均为 60")。

不幸的是,除非我删除破折号,否则我没有得到任何结果。[编辑-即使我正确地转义破折号并将其留在查询中,我也没有得到任何结果]。这看起来很奇怪,因为我正在使用PatternReplaceCharFilter- 我假设删除所有空格和破折号来对所有字母数字字符进行完整的模式替换。

管理页面中的查询分析器使用下面的模式显示了正确的匹配 - 所以我有点茫然。我在这里遗漏了 关于 thePatternReplaceCharFilter或 the 的一些基本内容吗?NGramTokenizerFactory

我已经检查了代码和其他帖子,但似乎无法弄清楚这一点。在将我的头撞到墙上一周之后,我将这个提交给堆栈的权威......

<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>
4

1 回答 1

0

So - something is definitely odd with PatternReplaceCharFilter failing to remove dashes at query time. Ultimately, I just did some pre-query processing in php of the user input with preg_replace before sending to Solr, and - viola! - worked like a charm with the expected results. Puzzling that the PatternReplaceCharFilter wasn't behaving...

Here's the pre-query php code that I used to get rid of the dashes, if anyone needs it.

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

After that, I just passed $res to Solr...

于 2011-07-08T18:38:56.453 回答