我目前正在使用我(错误地)认为是 Solr 的一个相当简单的实现NGramTokenizerFactory
,但是我得到了奇怪的结果,这些结果在管理分析器和实际查询结果之间不一致,我希望得到一些指导。
我试图让用户输入匹配我的 NGram (minGramSize=2, maxGramSize=2) 索引。我的索引和查询时间架构如下,其中
- 我使用删除所有非字母数字字符
PatternReplaceCharFilter
。 - 我用 标记化
NGramTokenizerFactory
。 - 我使用小写
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>