Rails 4中的弹性搜索+翻译内容

时间:2014-01-27 08:40:04

标签: ruby-on-rails-4 elasticsearch

我想在表格“content”上设置ElasticSearch,其中还有用于本地化目的的翻译表“content_translation”(Globalize gem)。我们有10种语言。

我想为我的数据模型实现Elasticsearch。在SQL中,我会搜索:

SELECT id, content_translation.content 
FROM content 
LEFT JOIN content_translation on content.id = content_translation.content_id
WHERE content_translation.content LIKE '%???????%'

我想知道使用ElasticSearch进行“左连接”的最佳策略是什么?

我应该只创建包含所有翻译数据的“内容”索引吗?

{"id":21, "translations":{"en":{"content":"Lorem..."}, "de":{"content":"Lorem..."} ..}

我应该创建“content_translation”索引并仅过滤特定区域设置的结果吗?

{"content_id":21, "locale":"en", "content": "Lorem ..."}

有一些好的做法怎么做?

我应该自己维护索引,还是应该使用像“Tire gem”这样的东西来处理自己的索引。

1 个答案:

答案 0 :(得分:3)

我会推荐第二种选择(每种语言一个文档),假设您不需要显示多种语言的内容。

即。

{"content_id":21, "locale":"en", "content": "Lorem ..."}

我推荐像Tire这样的宝石,并利用它的DSL。

您可以将内容模型看起来像:

class Content < ActiveRecord:Base

    include Tire::Model::Search
    include Tire::Model::Callbacks

    ...

end

然后你可以有一个类似

的搜索方法
Content.search do
    query do
        ...
    end
    filter :terms, :locale => I18n.locale.to_s
end

您的应用程序需要始终保持locale,以便提供相应的本地化内容。您可以使用I18n的区域设置并查找数据。只需将其作为过滤器传递,您就可以实现所需的分离。如果你在i18n中为rails启用了它,那么你可以免费获得后备补偿。

但是,如果您有一个需要并排显示多语言内容的用例,则会失败,您可以查看包含所有语言内容的单个文档。