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

Evo*_*o_x 3 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>
Run Code Online (Sandbox Code Playgroud)

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

pol*_*iro 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>
Run Code Online (Sandbox Code Playgroud)
  1. solr.WhitespaceTokenizerFactory 将在空白处生成令牌. ["e-tron"]
  2. solr.WordDelimiterFilterFactory 将分裂连字符,但也保留原始单词. ["e", "tron", "e-tron"]

  • 然后只需删除WordDelimiterFilterFactory.如果您查看文档,它会明确表示它会以" - "分割.http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory (2认同)