Ruby on rails 钢轨轮胎弹性误差

Ruby on rails 钢轨轮胎弹性误差,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我在数据库中为一款汽车模型编制了索引,其中有一条汽车记录梅赛德斯-奔驰。如果我搜索单词benz,我会得到一个错误: ActiveRecord::RecordNotFound in CarsController#index Couldn't find all Cars with IDs (1, 3) (found 1 results, but was looking for 2) 如果我搜索hello我会得到: Couldn't find Car with id=2 其他随机搜索词可以返回准

我在数据库中为一款
汽车
模型编制了索引,其中有一条汽车记录
梅赛德斯-奔驰
。如果我搜索单词
benz
,我会得到一个错误:

ActiveRecord::RecordNotFound in CarsController#index

Couldn't find all Cars with IDs (1, 3) (found 1 results, but was looking for 2)
如果我搜索
hello
我会得到:

Couldn't find Car with id=2
其他随机搜索词可以返回准确的结果

所以它基本上是由随机搜索词产生的随机错误。这可能是什么原因

控制器:

def index
 if params[:query].present?
    @cars = Car.search(params)
 else
    @cars = Car.paginate(:page => params[:page], :per_page => 10)
 end    
end
型号:

  def self.search(params)
   tire.search(load: true, page: params[:page], per_page: 10) do |s|
    s.query { string params[:query]} if params[:query].present?
   end
  end

这是因为您正在使用load=>true选项从数据库加载搜索结果。数据库中似乎缺少activerecord,但elasticsearch索引包含相同的文档

重新索引并不总是IMHO的解决方案

最好的解决方案是在数据库中删除文档时将其删除。您可以为此使用after_destroy回调

Tire remove api用于从索引中删除单个文档

Tire.index('my-index-name').remove('my-document-type', 'my-document-id')

参考资料:

我认为您的索引与数据库不同步。您已经从数据库中删除了一些汽车记录,但它们不会从搜索索引中删除。重新创建索引并尝试搜索。我找不到轮胎重新索引命令。我可以运行rake-db:drop+rake-db:setup来重新索引吗?你可以删除索引(例如:curl-XDELETE'),然后重新索引(rake-setup:tire)。你能解释一下如何/在何处使用销毁后回调吗?只需在你的模型中使用它<代码>提交后:某些方法,:on=>:destroy。在某些方法中,实现了从elasticsearch中删除文档的代码。我在回答中给出的那个。