我需要使用SOLR实现一些特定数字格式的全部和部分搜索。
格式是这样的: “01-1-00050-1”或 “M-1-02-00035-14”
如果我输入: 01; 01-1; 01-1-00050; 50;和类似的我应该得到“01-1-00050-1”的比赛。 但是,例如,如果我试图找到1-01则不应该匹配。
我目前的想法:
1)用“ - ”
将数字分成令牌<fieldType name="specific_number" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" />
/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" />
</analyzer>
</fieldType>
不幸的是,这不起作用,因为没有位置检查令牌。如果输入为“1-01”,它仍然会找到“01-1”。
此外,我需要能够找到而不在中间指定零。我在考虑
<filter class="solr.PatternReplaceFilterFactory" pattern="0{3,4}" replacement="" />
但是“050”在这种情况下会失败......
任何帮助将不胜感激!
答案 0 :(得分:0)
您的大部分示例似乎都不需要标记化,只需要NGram过滤器,因此输入会匹配索引文本的任何有效前缀。
这并不能解决为什么 50 应该匹配,但它似乎正好在字符串的中间。此外,目前还不清楚第二个例子中 M-1 应该会发生什么,它是否应该通过 M-1 或只是 1 匹配或者是其他东西。
因此,您可能需要澄清不仅仅是前缀匹配的额外规则。