6

我想使用 ElasticSearch + Tire 来搜索存储在 MongoDB 中的内容。

但是,当我尝试执行搜索时出现以下错误:

轮胎::Search::SearchRequestFailed 在 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

设置一个初始化程序(以下内容将在您的机器上本地工作,也可以在带有盆景插件的 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 > 

现在启动 rails 并重试。

于 2012-06-01T15:23:28.557 回答
1

... 也可以看看 :

Event.index.import Event.all

这样,您的所有记录都会加载到内存中,序列化为 JSON,然后通过线路发送到 ElasticSearch。这与之前的两个解决方案一样,应该避免“IndexMissingException[[events] missing]”错误。

于 2012-06-03T10:13:17.553 回答
1

如果您修改配置,可能会发生这种情况。如果您定义了一个,请尝试删除 Tire.configure。

于 2012-11-25T10:21:11.760 回答
0

你有索引你的事件模型吗?你的场地模型呢?弹性搜索也在寻找场地索引

我有一个 rake 任务来重新索引我的模型

desc "重新索引事件"
任务 :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 回答