Reputation: 1807
I want to use ElasticSearch + Tire to search stored in MongoDB.
However, I'm getting the following error when I try to perform a search:
Tire::Search::SearchRequestFailed in SearchController#index
404 : {"error":"IndexMissingException[[events] missing]","status":404}
From what I understand, this tells me that the indexes are missing for the Event, even though I've told it to generate them when I ran db:setup
.
Model:
class Event
include Mongoid::Document
include Mongoid::Timestamps
include Tire::Model::Search
include Tire::Model::Callbacks
field :name, :type => String
field :description, :type => String
field :started_at => Time
field :ended_at => Time
def to_indexed_json
self.as_json
end
end
Controller:
def search
Event.tire.search(params[:q])
end
Any ideas on how to resolve this please?
Upvotes: 6
Views: 4932
Reputation: 36243
This can happen if you modify the configuration. Try removing the Tire.configure if you define one.
Upvotes: 1
Reputation: 12679
... see also :
Event.index.import Event.all
This way all your records are loaded into memory, serialized into JSON, and sent down the wire to ElasticSearch. This, as well as the two solutions before, should evoid "IndexMissingException[[events] missing]" error.
Upvotes: 1
Reputation: 12679
... or even better, just run :
rake environment tire:import CLASS=Event FORCE=true
Upvotes: 12
Reputation: 12679
Set an Initializer ( the following will work locally on your machine and on heroku with bonsai add-on too, just in case ... ):
# config/initializers/bonsai.rb
if ENV['BONSAI_INDEX_URL']
Tire.configure do
url "http://index.bonsai.io"
end
BONSAI_INDEX_NAME = ENV['BONSAI_INDEX_URL'][/[^\/]+$/]
else
app_name = Rails.application.class.parent_name.underscore.dasherize
BONSAI_INDEX_NAME = "#{app_name}-#{Rails.env}"
end
In your model add the index_name
:
class Event
include Mongoid::Document
include Mongoid::Timestamps
include Tire::Model::Search
include Tire::Model::Callbacks
index_name BONSAI_INDEX_NAME
field :name, :type => String
field :description, :type => String
field :started_at => Time
field :ended_at => Time
def to_indexed_json
self.as_json
end
end
Then open your Rails console with rails c
and run :
1.9.2p290 :001 >Event.create_elasticsearch_index
=> 200 : {"ok":true,"acknowledged":true}
1.9.2p290 :002 > Tire.index BONSAI_INDEX_NAME
1.9.2p290 :003 > import Event.all
1.9.2p290 :004?> refresh
1.9.2p290 :005?> end
You should see something similar :
MONGODB (0ms) ... ['system.namespaces'].find({})
MONGODB (0ms) ... ['events'].find({})
=> #<Tire::Index:0xca8fb18 @name="your-app-name-development",@response=200 : {"ok":true,"_shards":{"total":10,"successful":5,"failed":0}}>
1.9.2p290 :006 >
Now start rails and re-try.
Upvotes: 3
Reputation: 2835
Have you indexed your Event model ? And your Venues model ? Elastic search is also looking for the Venues index
I have a rake task to reindex my Models
desc "Reindex event"
task :reindex_events => :environment dobatch_size = 1000 count = batch_size Event.all.find_in_batches(:batch_size => batch_size) { |objects| puts "Count: " + count.to_s count += batch_size Event.index.import objects }
end
Upvotes: 0