【问题标题】:Search based on locale on Sunspot Solr根据 Sunspot Solr 上的语言环境进行搜索
【发布时间】:2013-02-14 17:41:04
【问题描述】:

我正在使用以下方法在我的应用中国际化模型:

class GenreLocalization < ActiveRecord::Base
  attr_accessible :genre_id, :name, :locale
end

class Genre < ActiveRecord::Base
  has_many :genre_localizations, :dependent => :destroy

  def name(locale = nil)
    locale ||= I18n.locale
    genre_localizations.find_by_locale(locale).name
  end
end

如果我调用genre.name,它将返回当前语言环境中的流派名称。

现在我想根据语言环境用sunspot solr 索引这个模型。我的想法是为每一行存储idlocalized_namelocale 的组合。这样我就可以通过这种方式搜索流派:

search = Genre.search do
  keywords params[:search]
  with(:locale, 'en')
end

到目前为止,我最好的方法是:

searchable do
  Language.supported_locales.each do |locale|
    integer :id, :stored => true
    text    :name, :stored => true, :using => :name(locale)
    string  :locale
  end
end

但是text :name, :stored =&gt; true, :using =&gt; :name(locale) 行(显然)无效,我一直在努力寻找一种方法来索引本地化名称。

有没有办法做到这一点?这甚至是获得本地化搜索的正确方法吗?

【问题讨论】:

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


    【解决方案1】:

    如果这不是一组固定的流派,并且您将翻译存储在该表中,那么只需为每个语言环境创建一个单独的索引字段

    searchable do
      integer :id, :stored => true
      Language.supported_locales.each do |locale|
        text :"name_in_#{locale}", :stored => true do
          name(locale)
        end
      end
    end
    

    然后限制搜索本地化名称字段

    search = Genre.search do
      keywords params[:search] do
         fields(:"name_in_#{current_locale}")
      end
    end
    

    【讨论】:

    • I18n.backend.flattened_translations 返回 NoMethodError:未定义的方法 `flattened_translations'。但无论哪种方式,这都不是一套固定的流派。它们由管理员管理,管理员将设置本地化名称。
    • 我完全改变了我的答案,请告诉我
    • 我使用genre_localizations 表作为流派表的i18n 后端。一个流派 has_many GenreLocalizations(每个语言环境一个),然后我只需要执行 Genre.genre_localizations.find_by_locale(locale).name ,其中语言环境字符串由 I18n.locale 设置
    • 快到了。我现在可以按语言环境找到完全匹配的内容。我使用区域设置的前缀而不是后缀,因为我还使用 solr 架构中的以下动态字段来索引 name_splitting 字段: 但我仍然找不到部分匹配项
    • _splitting* 的规则很好。我将该字段提交为 而不是 。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    相关资源
    最近更新 更多