我目前正在使用我(错误地)认为是Solr的NGramTokenizerFactory
的相当简单的实现,但是我得到了管理分析器和实际查询结果之间不一致的奇怪结果,我是希望得到一些指导。
我正在尝试获取用户输入以匹配我的NGram(minGramSize = 2,maxGramSize = 2)索引。我的索引和查询时间模式如下:
PatternReplaceCharFilter
删除所有非字母数字字符。NGramTokenizerFactory
进行标记。LowerCaseFilterFactory
小写(这会留下非字母代币,所以我的数字会保留)。 使用下面的模式,我认为搜索“PCB-1260”(带有正确转义的短划线)应该与索引的Ngram标记化和小写的“Arochlor-1260”值匹配(即,1260的bigrams是索引值和查询值中的“12 26 60”)。
不幸的是,除非我删除破折号,否则我没有结果。 [编辑 - 即使我正确地逃离破折号并将其留在查询中,我也没有得到任何结果]。这看起来很奇怪,因为我正在使用PatternReplaceCharFilter
对所有字母数字字符进行完整的模式替换 - 我假设删除了所有空格和短划线。
管理页面中的查询分析器使用下面的模式显示正确的匹配 - 所以我有点不知所措。我在这里遗失的PatternReplaceCharFilter
或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>
答案 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 ......