3

データベース内のCar1 つの車のレコードを持つモデルにインデックスを付けました。mercedes benz単語を検索すると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
4

1 に答える 1

3

これは、データベースから検索結果をロードするために load => true オプションを使用しているために発生します。DB にアクティブ レコードがないようですが、elasticsearch インデックスには同じドキュメントが含まれています。

再インデックスが常に解決策であるとは限りません。

最善の解決策は、ドキュメントが db で削除されたときにドキュメントを削除することです。これには after_destroy コールバックを使用できます。

Tire remove API は、インデックスから単一のドキュメントを削除するために使用されます。

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

参考:https ://github.com/karmi/tire/issues/43

于 2013-04-20T06:54:00.560 に答える