LightBox
LightBox

Reputation: 3425

rails tire elasticsearch weird error

I have indexed a Car model with one car record mercedes benz in the database. If I search for the word benz I get an error:

ActiveRecord::RecordNotFound in CarsController#index

Couldn't find all Cars with IDs (1, 3) (found 1 results, but was looking for 2)

If I search for hello I get:

Couldn't find Car with id=2

Other random search terms work returning accurate results.

So it's basically random errors generated by random search terms. What could be the cause of this?

Controller:

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

Model:

  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

Upvotes: 3

Views: 881

Answers (1)

Vamsi Krishna
Vamsi Krishna

Reputation: 3792

This happens because, you are using the load => true option to load the search results from database. The activerecord seems to be missing in DB, but the elasticsearch index contains the same document.

Reindex is not always the solution IMHO.

The best solution is to delete the document when it is deleted in db. You can use the after_destroy callback for this.

Tire remove api is used to remove a single document from index.

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

Reference: https://github.com/karmi/tire/issues/43

Upvotes: 3

Related Questions