我有一个必须处理零件号的Solr索引 - WordDelimiterFilterFactory
似乎非常适合。示例部件号可以是“CH2300-100”。我期待以下查询匹配此字段(他们这样做):
但是以下查询不匹配:
查看调试输出 - 不会生成单词部分的组合。我希望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>
答案 0 :(得分:3)
我怀疑'CH2300'不是索引标记,因为splitOnNumerics =“1”。在分裂阶段,它将CH和2300分开,然后将所有发生器单独应用于那些(以及链接的令牌)。
一个选项是将splitOnNumerics =“0”添加到过滤器工厂。但是,这可能会使“CH”无法匹配。另一个选择是在查询时添加一个过滤器工厂,该工厂拆分数字。
修改强>
第三种可能更好的选择是使用shingle filter factory并保留splitOnNumerics =“1”,以便将所有CH,2300和CH2300编入索引。在单词分隔符过滤器工厂后添加此行应该可以解决问题:
<filter class="solr.ShingleFilterFactory" tokenSeparator=""/>