2

我有一个必须处理零件编号的 Solr 索引——这WordDelimiterFilterFactory似乎非常适合。示例部件号可以是“CH2300-100”。我期望以下查询与该字段匹配(并且确实如此):

  • 甲烷
  • CH2300-100
  • CH2300100

但以下查询不匹配:

  • CH2300

查看调试输出 - 不会生成单词部分的组合。我希望catenateWordsand/orcatenateNumbers属性能够处理这种情况,但它似乎不起作用。我是否在配置中遗漏了允许匹配标记化片段的所有排列的内容?

<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>
4

1 回答 1

3

我怀疑“CH2300”不是索引标记,因为 splitOnNumerics="1"。在拆分阶段,它将 CH 和 2300 分开,然后将所有生成器分别应用于这些生成器(以及连接的令牌)。

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

编辑

第三种可能更好的选择是使用shingle过滤器工厂并保留 splitOnNumerics="1" 以便所有 CH、2300 和 CH2300 都被索引。在您的单词分隔符过滤器工厂之后添加此行应该可以解决问题:

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

于 2013-07-17T19:34:49.500 回答