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
}    

конец

Другие вопросы по тегам