WordDelimiterFilterFactory不包括所有排列

时间:2013-07-17 18:42:52

标签: solr solr4

我有一个必须处理零件号的Solr索引 - WordDelimiterFilterFactory似乎非常适合。示例部件号可以是“CH2300-100”。我期待以下查询匹配此字段(他们这样做):

  • CH
  • CH2300-100
  • CH2300100

但是以下查询不匹配:

  • CH2300

查看调试输出 - 不会生成单词部分的组合。我希望catenateWords和/或catenateNumbers属性能够处理这种情况,但似乎无法正常工作。我是否遗漏了配置中的某些内容,以便匹配标记化片段的所有排列?

<schema version="1.5" name="test">
  <types>
    <fieldType name="text" class="solr.TextField">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="0" preserveOriginal="1" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
      </analyzer>
    </fieldType>
  </types>
  <fields>
    <field stored="true" name="id" type="text" />
    <field stored="true" indexed="true" name="catnum" type="text" />
  </fields>
  <uniqueKey>id</uniqueKey>
</schema>

1 个答案:

答案 0 :(得分:3)

我怀疑'CH2300'不是索引标记,因为splitOnNumerics =“1”。在分裂阶段,它将CH和2300分开,然后将所有发生器单独应用于那些(以及链接的令牌)。

一个选项是将splitOnNumerics =“0”添加到过滤器工厂。但是,这可能会使“CH”无法匹配。另一个选择是在查询时添加一个过滤器工厂,该工厂拆分数字。

修改

第三种可能更好的选择是使用shingle filter factory并保留splitOnNumerics =“1”,以便将所有CH,2300和CH2300编入索引。在单词分隔符过滤器工厂后添加此行应该可以解决问题:

<filter class="solr.ShingleFilterFactory" tokenSeparator=""/>