6

ElasticSearch + Tire を使用して、MongoDB に保存されている検索を行いたいと考えています。

ただし、検索を実行しようとすると、次のエラーが表示されます。

Tire::Search::SearchRequestFailed in SearchController#index

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

これを解決する方法についてのアイデアはありますか?

4

5 に答える 5

12

...またはさらに良いことに、実行するだけです:

rake environment tire:import CLASS=Event FORCE=true
于 2012-06-02T06:25:35.610 に答える
3

初期化子を設定します (念のため、以下はマシンと bonsai アドオンを備えた 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 > 

レールを起動して再試行します。

于 2012-06-01T15:23:28.557 に答える
1

...も参照してください:

Event.index.import Event.all

このようにして、すべてのレコードがメモリに読み込まれ、JSONにシリアル化され、ElasticSearchに送信されます。これは、以前の2つの解決策と同様に、「IndexMissingException[[events]missing]」エラーを回避する必要があります。

于 2012-06-03T10:13:17.553 に答える
1

これは、構成を変更した場合に発生する可能性があります。Tire.configure を定義している場合は、削除してみてください。

于 2012-11-25T10:21:11.760 に答える
0

Event モデルにインデックスを付けましたか? そしてあなたの会場モデル?エラスティック検索は会場インデックスも探しています

モデルのインデックスを再作成するレーキ タスクがあります

desc "Reindex イベント"
task :reindex_events => :environment do

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
}    

終わり

于 2012-04-19T05:10:08.760 に答える