模糊“开始于”在多个单词上搜索Solr和Sunspot

时间:2013-02-14 17:50:37

标签: solr ruby-on-rails-3.2 sunspot-solr

我正在尝试根据他们的姓名和所属国家的名称提供文字搜索来查找城市。

例如,我想返回Milan, Italy进行搜索mil ita,或Los Angeles, United States搜索los ang uni

这些是我现有的模型(省略了验证):

class City < ActiveRecord::Base
  belongs_to :country

  searchable do
    text :name
    text :country do
      country.name
    end
  end
end

class Country < ActiveRecord::Base
end

这是我的solr schema.xml文件的相关部分:

<fieldtype class="solr.TextField" positionIncrementGap="100" name="text">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <!--<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>-->
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.TrimFilterFactory" />
    <filter class="solr.EdgeNGramFilterFactory"
            minGramSize="3"
            maxGramSize="30"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <!--<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>-->
    <filter class="solr.ISOLatin1AccentFilterFactory"/>
    <filter class="solr.TrimFilterFactory" />
  </analyzer>
</fieldtype>

我正在控制器中执行搜索:

search = City.search do
  fulltext params[:q]
  paginate page: 1, per_page: 10
end

这里会发生什么,如果我搜索mil,我会得到Milan, Italy,但搜索mil ita将不会返回任何内容。

有什么想法吗?

提前谢谢你,

1 个答案:

答案 0 :(得分:0)

找到了一个解决方案,我以为我会分享。

您只需要构建一个“自定义字段”,其中包含您要启用搜索的所有文本,例如(在City模型中):

searchable do
  text :composite_name do
    "#{name} #{country.name}"
  end
end

这很有效。