Rails sunspot-solr - 带连字符的单词

时间:2013-06-20 23:10:47

标签: ruby-on-rails n-gram sunspot-solr

我正在使用sunspot_rails宝石,到目前为止一切都很完美但是:我没有得到任何带连字符的搜索结果。

实施例: 字符串“tron”返回大量结果(所有文章中提到的单词都是e-tron)

字符串“e-tron”返回0结果,即使这是我所有文章中提到的正确单词。

我当前的schema.xml配置:

    <fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

我想要的:搜索字符串tron的行为当然没问题,但我也希望搜索字符串e-tron具有正确的匹配。

1 个答案:

答案 0 :(得分:8)

问题是solr.StandardTokenizerFactory是用连字符分割单词所以“e-tron”会生成标记“e”,“tron”。大概“e”会丢失,因为solr.TextField过滤器的最小令牌大小为2。

这是一个可以显示您特定问题的示例。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
  1. solr.WhitespaceTokenizerFactory将在空白处生成令牌。 ["e-tron"]
  2. solr.WordDelimiterFilterFactory将拆分连字符,但也保留原始单词。 ["e", "tron", "e-tron"]
相关问题