2012-04-19 11 views
6

Quiero usar ElasticSearch + Tire para buscar almacenado en MongoDB.Ruby: ElasticSearch + Tire error Tiro :: Buscar :: SearchRequestFailed - ¿IndexMissingException?

Sin embargo, estoy recibiendo el siguiente error al intentar realizar una búsqueda:

neumáticos :: Buscar :: SearchRequestFailed en SearchController N.º

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

Por lo que entiendo, esto me dice que los índices faltan para el Evento, aunque le dije que los genere cuando ejecuté db:setup.

Modelo:

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 

controlador:

def search 
    Event.tire.search(params[:q]) 
    end 

Cualquier ideas sobre cómo resolver esto, por favor?

+0

Actualice el modelo - No veo ninguna definición de 'campo' allí. Con todo, cuando cargues la aplicación, deberás crearla, a menos que ya exista. – karmi

+0

@karmi: He agregado campos al modelo ahora. – gabriel

+0

Me di cuenta de que el problema era que el modelo no se estaba agregando al índice ElasticSearch cuando se guardó. Intenté agregarlo/importarlo manualmente, pero parece que no puedo hacerlo funcionar ... Cualquier ayuda para resolver esto sería muy apreciada. – gabriel

Respuesta

0

¿Ha indexado su modelo de eventos? ¿Y tu modelo de Venues? elasticsearch también está buscando el índice Lugares

que tienen una tarea rastrillo para indexar mis modelos

desc "evento Reindex"
tarea: reindex_events =>: Entorno hacer

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 
}  

end

+0

Interesante, ¿las tareas de Rake importadas vienen cortas? – karmi

+0

@Andrew: Lo siento, copié el mensaje de error equivocado, ya que también estaba tratando de probarlo con mi modelo Venue también; debería haber dicho '[[events] missing] '. He actualizado la pregunta anterior para reflejar esto. – gabriel

+0

He intentado con 'rake db: mongoid: create_indexes' y' rake environment tire: import CLASS = 'Event'', pero parece que no puedo hacer que funcione, lo cual es muy frustrante. Cualquier ayuda sería muy apreciada. – gabriel

3

Establezca un inicializador (lo siguiente funcionará localmente en su máquina y en heroku bonsai con add-on también, por si acaso ...):

# 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 

En su modelo de añadir el 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 

continuación, abra la consola de Rails con rails c y ejecute:

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 

Debería ver algo 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 > 

Ahora inicie los rieles y vuelva a intentarlo.

+1

Para la posteridad, las cosas 'index_name' ya no deberían ser necesarias con Bonsai. Perdimos nuestro anterior diseño de un índice por complemento para jugar muy bien con las convenciones de Tyre con el uso de nomenclatura y uso de índices. –

12

... o incluso mejor, basta con ejecutar:

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

... véase también:

Event.index.import Event.all 

De esta manera todos sus registros se cargan en memoria, serializado en JSON, y se envían por el cable a ElasticSearch. Esto, así como las dos soluciones anteriores, deberían evocar el error "IndexMissingException [[events] missing]".

1

Esto puede suceder si modifica la configuración. Intente eliminar Tire.configure si define uno.

Cuestiones relacionadas