Searchkick异步重索引未拾取队列新增变更,求解决方法
问题解决思路
问题根源
当你使用Product.reindex(mode: :async)时,Searchkick会创建一个临时索引来逐步构建新的索引数据,完成后再替换原有的活跃索引。而默认的Searchkick::ProcessQueueJob只会操作当前的活跃索引,不会对正在构建的临时索引生效——所以你新创建的new_product只会被加到旧索引里,不会进入正在重索引的新索引。
具体解决办法
办法1:手动将新记录追加到临时索引
异步重索引启动后,先获取临时索引的名称,然后手动将新创建的商品索引到该临时索引:# 启动异步重索引并获取临时索引名 reindex_result = Product.reindex(mode: :async) temp_index_name = reindex_result[:index_name] # 创建新商品后,手动索引到临时索引 new_product = Product.create(...) new_product.reindex(index_name: temp_index_name)办法2:改用
:background重索引模式
如果不需要临时索引的原子替换特性,可以用:background模式——它直接在当前活跃索引上做增量更新,队列任务处理的就是同一个索引,新商品会被正常纳入:Product.reindex(mode: :background)注意:这个模式下重索引过程中,原索引的数据会实时更新,可能存在短暂的数据不一致。
办法3:自定义队列任务目标索引
如果你必须保留:async模式,可以在执行队列任务时,指定目标为正在构建的临时索引:# 获取Product的临时索引(如果正在重索引) temp_index = Product.searchkick_index.temp_index if temp_index&.exists? # 针对临时索引执行队列任务 Searchkick::ProcessQueueJob.perform_now(class_name: "Product", index_name: temp_index.name) else # 正常处理活跃索引 Searchkick::ProcessQueueJob.perform_now(class_name: "Product") end
内容的提问来源于stack exchange,提问作者dwo
相关产品推荐
相关产品推荐

