我目前使用的是什么我(错误地)以为会是一个相当简单的实现Solr的的NGramTokenizerFactory
,但我发现了奇怪的结果是管理员分析和实际查询结果之间的不一致,我希望获得一些指导。
我试图让用户输入符合我的NGRAM(minGramSize = 2,maxGramSize = 2)指数。 我的索引和查询时间模式如下,其中
- 我剥使用所有的非字母数字字符
PatternReplaceCharFilter
。 - 我记号化与
NGramTokenizerFactory
。 - 我用小写
LowerCaseFilterFactory
(这让非字母标记的地方,所以我的号码将保持)。
用下面的模式,我认为,对于“PCB-1260”的搜索(用正确转义横线),应符合“Arochlor-1260”的索引NGRAM记号化和小写的值(即,1260的双字母组是“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>