Solr Ngram匹配祸害

时间:2012-01-17 07:39:21

标签: search solr lucene full-text-search

这是我的(非常标准的)ngram架构 -

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

现在laptop_ngram:“g74sx-a”返回 -

<arr name="laptop_ngram">
  <str>ASUS G74SX-A1 17.3-Inch Gaming Laptop</str>
</arr>

但是laptop_ngram:“g74sx-a1”什么也没找到。

顺便说一下,逃避“ - ”没有任何区别。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

StandardTokenizerFactory可能会对该术语执行某些操作。您可以在分析页面中查看此内容。

因此,更改为WhitespaceTokenizerFactory可以解决问题。

答案 1 :(得分:1)

感谢O. Klein,他向我展示了新的方向。

我最终解决了WhitespaceTokenizerFactory和WordDelimiterFilterFactory -

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

适用于“g74sx”,“g74sx-”,“g74sx-a”和“g74sx-a1”

然而,旅程并未在此结束,因为我仍在探索原因 -

“G74SX-XA1”与“g74sx-x”和“g74sx-xa1”相符,但不是“g74sx-xa”......