我正在使用 sunspot_rails gem,到目前为止一切正常,但是:我没有得到任何带有连字符的单词的搜索结果。

例子:
字符串“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 有正确的匹配项。

最佳答案

问题是 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>
  • solr.WhitespaceTokenizerFactory 将在空白处生成标记。 ["e-tron"]
  • solr.WordDelimiterFilterFactory 将在连字符上拆分,但也会保留原始单词。 ["e", "tron", "e-tron"]
  • 关于ruby-on-rails - Rails sunspot-solr - 带连字符的单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17225344/

    10-12 01:26