ruby-on-rails - Rails sunspot-solr - 带连字符的单词

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

我正在使用 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>
  1. solr.WhitespaceTokenizerFactory 将在空白处生成 token 。 ["e-tron"]
  2. solr.WordDelimiterFilterFactory 将在连字符处拆分,但也会保留原始单词。 ["e", "tron", "e-tron"]

关于ruby-on-rails - Rails sunspot-solr - 带连字符的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225344/

相关文章:

ruby-on-rails - 在 Ruby 中将 snake case 转换为普通句子

ruby-on-rails - 带 3D secure 的 Stripe 订阅不完整

postgresql - elasticsearch ngram 和 postgresql trigram 搜索结果不匹配

elasticsearch - 如何获得Elasticsearch为匹配顺序的 token 字符串分配更高的分数?

mysql - 报告销毁后重建索引花费的时间太长

ruby-on-rails - libmysqlclient_r.so.16 : cannot open shared object file: No such file or directory DREAMHOST

ruby-on-rails - 使用 ruby​​ on Rails 创建用户登录计数方法

search - nGram 部分匹配和限制 nGram 导致多字段查询

ruby-on-rails - Sunspot -- Boost 记录出现在文本早期的匹配项

ruby-on-rails - rails solr 搜索限制总搜索结果/获得固定数量的结果