2012-04-19 5 views
6

Я хочу использовать ElasticSearch + Tire для поиска в MongoDB.Ruby: ElasticSearch + Ошибка шины Шины :: Поиск :: SearchRequestFailed - IndexMissingException?

Однако, я получаю следующее сообщение об ошибке при попытке выполнить поиск:

Tire :: Поиск :: SearchRequestFailed в SearchController # индекс

404 : {"error":"IndexMissingException[[events] missing]","status":404} 

Из того, что я понимаю, это говорит мне о том, что индексы отсутствуют для события, хотя я сказал ему генерировать их, когда я запустил 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 

Любые идеи о том, как решить эту проблему, пожалуйста?

+0

Пожалуйста, обновите модель - я не вижу никаких определений 'field' там. В общем, когда вы загружаете приложение, он должен быть создан, если он уже не существует. – karmi

+0

@karmi: Я добавил поля к модели сейчас. – gabriel

+0

Я понял, что проблема в том, что модель не добавлялась в индекс ElasticSearch, когда она была сохранена. Я попытался вручную добавить/импортировать его, но я не могу заставить его работать ... Любая помощь в решении этого будет очень признательна. – gabriel

ответ

0

Вы проиндексировали свою модель событий? И ваша модель объектов? Упругие поиск также ищет индекс Центры

У меня есть задача грабли переиндексации мои модели

DESC "переиндексации событие"
задачи: 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 
}  

конец

+0

Интересно, не хватает ли связанных задач импорта Rake? – karmi

+0

@Andrew: Извините, я скопировал неправильное сообщение об ошибке, так как я также пытался проверить его с моей моделью места; он должен был сказать '[[events] missing]'. Я обновил этот вопрос, чтобы отразить это. – gabriel

+0

Я пробовал «rake db: mongoid: create_indexes» и «шину окружения шины: импортировать CLASS =« Event », но я не могу заставить его работать, что очень расстраивает. Любая помощь будет принята с благодарностью. – gabriel

3

Установите Инициализатор (следующее будет работать локально на вашей машине и на герою с Бонсай надстройку тоже, на всякий случай ...):

# 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 > 

Теперь начните рельсы и повторите попытку.

+1

Для потомков, материал 'index_name' больше не нужно больше с бонсай. Мы ослабили наш более ранний дизайн с одним индексом для аддонов, чтобы хорошо сочетаться с соглашениями Tire с наименованием и использованием индексов. –

12

... или еще лучше, просто запустите:

rake environment tire:import CLASS=Event FORCE=true 
1

... Смотри также:

Event.index.import Event.all 

Таким образом, все ваши записи будут загружены в память, сериализовать в формате JSON, и послал вниз по экрану к ElasticSearch. Это, а также два решения раньше, должны исключить ошибку IndexMissingException [[events] missing].

1

Это может произойти, если вы измените конфигурацию. Попробуйте удалить Tire.configure, если вы его определите.

Смежные вопросы