我想在表格“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”这样的东西来处理自己的索引。
答案 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启用了它,那么你可以免费获得后备补偿。
但是,如果您有一个需要并排显示多语言内容的用例,则会失败,您可以查看包含所有语言内容的单个文档。