2012-04-19 8 views
6

MongoDBに保存されている検索にElasticSearch + Tireを使いたいです。Ruby:ElasticSearch + TireエラーTire :: Search :: SearchRequestFailed - IndexMissingException?

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

私が理解から

タイヤ::検索:: SearchControllerの#インデックスにSearchRequestFailed、:私は、検索を実行しようとすると、

はしかし、私は次のエラーを取得していますこれは、私が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

イベントモデルのインデックスを作成しましたか?あなたのVenuesモデルは?やる

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 
}  

環境:reindex_events =>:弾性検索も

が、私は私のモデル

DESC "再インデックスイベント"
タスクのインデックスを再作成するためにrakeタスクを持って会場インデックスを探しています終了

+0

興味深いことに、バンドルされたインポートRakeタスクは短くなりますか? – karmi

+0

@Andrew:申し訳ありませんが、間違ったエラーメッセージがコピーされました。私もVenueモデルでもテストしようとしていました。それは '[[events] missing]'と言っていたはずです。私はこれを反映するために上記の質問を更新しました。 – gabriel

+0

私は 'rake db:mongoid:create_indexes'と' rake environment tire:import 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 cであなたのRailsコンソールを開いて、実行します。

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の規約をうまくやるために、以前の1つの索引/アドオン・デザインを緩めました。 –

12

...または、より良い、ちょうど実行します。

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

を...も参照してください。

Event.index.import Event.all 

をこの方法で、すべてのレコードは、メモリにロードされたJSONにシリアライズし、送信されますワイヤをElasticSearchに降ろす。これは、以前の2つのソリューションと同様に、「IndexMissingException [[events] missing]」エラーを回避する必要があります。

1

これは、設定を変更した場合に発生します。定義している場合は、Tire.configureを削除してみてください。

関連する問題