SOLR精确和部分匹配

时间:2014-11-21 15:17:45

标签: solr lucene

我需要使用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”在这种情况下会失败......

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您的大部分示例似乎都不需要标记化,只需要NGram过滤器,因此输入会匹配索引文本的任何有效前缀。

这并不能解决为什么 50 应该匹配,但它似乎正好在字符串的中间。此外,目前还不清楚第二个例子中 M-1 应该会发生什么,它是否应该通过 M-1 或只是 1 匹配或者是其他东西。

因此,您可能需要澄清不仅仅是前缀匹配的额外规则。