Rails4生产环境Elasticsearch geo_point字段找不到问题求助
解决Searchkick生产环境找不到geo_point字段的问题
嘿,我之前也碰到过类似的生产环境索引不一致的坑,咱们一步步来排查解决你的问题:
1. 先确认生产环境的索引mapping是否正确
首先得搞清楚Elasticsearch的索引里到底有没有location这个geo_point字段。登录到你的DigitalOcean服务器,执行这条命令:
curl -XGET 'http://localhost:9200/halls/_mapping?pretty'
(这里默认索引名是halls,如果你的索引名不一样,替换成对应的名字就行)
看返回的结果里,有没有类似这样的结构:
"location": { "type": "geo_point" }
如果没有,那问题就出在索引的mapping没正确生成,接下来就需要重新生成索引。
2. 重新生成生产环境的索引
开发环境你可能手动刷新过索引,但生产环境部署后大概率没做这一步。执行以下操作:
- 进入生产环境的Rails控制台:
RAILS_ENV=production rails c - 执行重新索引命令:
如果你的Hall数据量很大,建议用异步索引避免阻塞:Hall.reindexHall.reindex(async: true)
重新索引完成后,再用第一步的curl命令检查mapping,确认location字段已经是geo_point类型了。
3. 检查版本兼容性
有时候开发和生产环境的Searchkick、Elasticsearch版本不匹配,也会导致mapping生成异常:
- 查看生产环境Elasticsearch版本:
elasticsearch --version - 查看Gemfile里的Searchkick版本,对照Searchkick的官方说明确认两者是否兼容。比如旧版Searchkick可能不支持新版ES,反过来也一样。
4. 确认生产环境的数据完整性
如果有些Hall的关联address是空的,或者address的经纬度缺失,会导致search_data里的location字段无法生成,进而影响索引的mapping:
在生产控制台执行:
# 检查有没有空地址的Hall Hall.where(address: nil).count # 检查有没有经纬度为空的address Hall.joins(:address).where(addresses: {latitude: nil, longitude: nil}).count
如果有缺失的数据,先补全这些记录,再重新索引一次。
5. 检查Searchkick的生产环境配置
有时候生产环境的config/initializers/searchkick.rb可能和开发环境有差异,比如设置了不同的索引前缀,导致实际使用的索引不是你预期的那个。确认生产环境的Searchkick配置和开发环境完全一致,特别是索引相关的设置。
一般来说,重新生成索引就能解决大部分这类问题。如果还是不行,再依次排查版本和数据的问题。
内容的提问来源于stack exchange,提问作者Milind
相关产品推荐
相关产品推荐

