如何在使用Searchkick的Rails应用中实现单字段对应单语言的多语言支持
Searchkick 实现单字段对应单语言的多语言搜索方案
1. 自定义分析器与多语言字段配置
首先在业务模型中配置Searchkick的自定义设置,为每种需要支持的语言声明对应分析器,同时为每个多语言业务字段创建对应语言的独立索引字段:
class Product < ApplicationRecord # 可根据业务调整需要做多语言适配的字段 MULTI_LANG_FIELDS = [:name, :description] # 可根据业务调整支持的语言列表 SUPPORTED_LOCALES = [:en, :zh, :ja] searchkick settings: { analysis: { analyzer: { en_analyzer: { type: "english" # Elasticsearch内置英文分析器 }, zh_analyzer: { type: "ik_max_word" # 使用中文IK分词填该值,未装插件可使用内置chinese分析器 }, ja_analyzer: { type: "kuromoji" # Elasticsearch内置日语分析器 } } } } do # 批量生成对应语言的索引字段,绑定对应分析器 SUPPORTED_LOCALES.each do |locale| MULTI_LANG_FIELDS.each do |field| field "#{field}_#{locale}".to_sym, analyzer: "#{locale}_analyzer".to_sym end end # 其他无需多语言适配的普通字段正常配置即可 fields [:price, :stock, :category_id] end end
2. 多语言字段数据同步
重写模型的search_data方法,将不同语言的内容映射到对应的索引字段中:
def search_data base_data = { price: price, stock: stock, category_id: category_id } # 填充所有多语言索引字段的内容 SUPPORTED_LOCALES.each do |locale| MULTI_LANG_FIELDS.each do |field| # 此处替换为实际业务中获取对应语言字段值的逻辑即可 base_data["#{field}_#{locale}"] = send("#{field}_#{locale}") end end base_data end
3. 按指定语言执行搜索
搜索时根据当前使用的语言,指定对应语言后缀的字段作为搜索范围即可:
# 取当前用户选择的语言,可根据业务逻辑调整取值来源 current_locale = I18n.locale # 构造当前语言对应的搜索字段列表 search_fields = MULTI_LANG_FIELDS.map { |f| "#{f}_#{current_locale}" } # 执行搜索 Product.search("搜索关键词", fields: search_fields)
注意事项
- 如果你使用的是Elasticsearch非内置分析器(如中文IK分词、日语kuromoji分词等),需要先在Elasticsearch服务中安装对应插件,否则索引创建会报错
- 每次修改Searchkick的分析器、字段配置后,必须重建索引才能生效,重建命令为
rails searchkick:reindex CLASS=你的模型类名 - 如果需要实现跨语言混合搜索,可以在
fields参数中传入多个语言的字段,同时配合boost参数调整不同语言字段的搜索权重
内容的提问来源于stack exchange,提问作者Stayman Hou
相关产品推荐
相关产品推荐

