Ruby: ElasticSearch + ошибка шины. Tire::Search::SearchRequestFailed - IndexMissingException?
Я хочу использовать ElasticSearch + Tire для поиска, хранящегося в MongoDB.
Тем не менее, я получаю следующую ошибку при попытке выполнить поиск:
Tire:: Search:: SearchRequest Не отправлено в SearchController#index
404 : {"error":"IndexMissingException[[events] missing]","status":404}
Из того, что я понимаю, это говорит мне о том, что индексы для Event отсутствуют, хотя я сказал, чтобы они генерировались при запуске db:setup
,
Модель:
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
контроллер:
def search
Event.tire.search(params[:q])
end
Любые идеи о том, как решить эту проблему, пожалуйста?
5 ответов
... или даже лучше, просто беги:
rake environment tire:import CLASS=Event FORCE=true
Установите Initializer (следующее будет работать локально на вашей машине и на heroku с надстройкой бонсай, на всякий случай...):
# 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
В вашей модели добавьте 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
Затем откройте консоль Rails с rails c
и запустить:
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
Вы должны увидеть что-то похожее:
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 >
Теперь начните рельсы и попробуйте снова.
Это может произойти, если вы измените конфигурацию. Попробуйте удалить Tire.configure, если вы его определили.
... смотрите также:
Event.index.import Event.all
Таким образом, все ваши записи загружаются в память, сериализуются в JSON и отправляются по проводам в ElasticSearch. Это, как и два предыдущих решения, должно исключать ошибку "IndexMissingException[[events] missing]".
Вы проиндексировали свою модель события? А ваша модель Venues? Эластичный поиск также ищет индекс мест
У меня есть грабли для переиндексации моих моделей
desc "Reindex event"
task: reindex_events =>: среда выполненияbatch_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 }
конец