Rails4中使用SearchKick自定义ElasticSearch索引数据的疑问
嘿,我来帮你理清这两个问题:
首先,你在search_data里写active: true并不能实现只索引活跃项——因为search_data的作用是定义每条被索引记录包含哪些数据,而不是过滤哪些记录需要被索引。要控制哪些Shop被加入Elasticsearch索引,得用Searchkick专门的scope配置项。
然后,index: "not_analyzed"放在search_data里也是错误的——这个是Elasticsearch的字段映射设置,应该在searchkick方法的配置里指定,而不是数据哈希中。
接下来给你正确的实现方式:
1. 配置只索引活跃的Shop记录
在Shop模型里,通过searchkick方法的scope参数传入一个lambda,用来筛选要索引的记录:
2. 正确设置字段的映射(比如非分析字段)
如果你想让某些字段(比如name、slug)不被分词分析,需要在searchkick的mappings参数里定义字段类型,Elasticsearch现在用keyword类型对应旧版的not_analyzed。
完整的Shop模型示例
class Shop < ApplicationRecord has_many :dealers has_one :address has_one :contact # Searchkick核心配置:过滤索引范围 + 字段映射 searchkick scope: -> { where(active: true) }, mappings: { shop: { properties: { name: { type: "keyword" }, # 不被分词,适合精确匹配 capacity: { type: "integer" }, slug: { type: "keyword" } } } } # 定义要索引的字段数据 def search_data { name: name, capacity: capacity.to_i, slug: slug, # 可选:添加关联模型的字段(用&.避免nil报错) address_city: address&.city, contact_phone: contact&.phone } end end
最后一步:重新生成索引
修改配置后,需要重新构建索引才能生效,在Rails控制台运行:
Shop.reindex
这样一来,只有active: true的Shop会被索引,而且你指定的字段也会按照正确的映射类型存储在Elasticsearch里啦。
内容的提问来源于stack exchange,提问作者Milind
相关产品推荐
相关产品推荐

