2012-04-19 95 views
6

我想使用ElasticSearch + Tire搜索存儲在MongoDB中。Ruby:ElasticSearch +輪胎錯誤輪胎:: Search :: SearchRequestFailed - IndexMissingException?

不過,我得到以下錯誤,當我嘗試執行搜索:

輪胎::搜索:: 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 2012-04-20 07:31:56

+0

@karmi:我已經將模型添加到模型中了。 – gabriel 2012-04-22 20:10:20

+0

我意識到問題在於保存模型時未將模型添加到ElasticSearch索引中。我嘗試手動添加/導入它,但我似乎無法得到它的工作...任何幫助解決這個將不勝感激。 – gabriel 2012-04-22 20:11:29

回答

0

您是否爲您的事件模型建立了索引?你的場地模型?彈性搜索也尋找場地指數

我有一個rake任務,以重新編制我的模型

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 
}  

end

+0

有趣的是,捆綁的導入Rake任務是否短缺? – karmi 2012-04-19 10:35:08

+0

@Andrew:對不起,我複製了錯誤的錯誤信息,因爲我也試圖用我的Venue模型來測試它;它應該說'[[事件]失蹤]'。我已經更新了上面的問題以反映這一點。 – gabriel 2012-04-19 12:29:57

+0

我試過'耙db:mongoid:create_indexes'和'耙環境輪胎:導入CLASS ='事件',但我似乎無法得到它的工作,這是非常令人沮喪。任何幫助將不勝感激。 – gabriel 2012-04-19 12:31:50

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 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的約定。 – 2013-03-22 07:22:46

12

...甚至更好,只需要運行:

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

...還看到:

Event.index.import Event.all 

這樣,所有的記錄都加載到內存中,序列化爲JSON,並送將導線連接到ElasticSearch。這個以及之前的兩個解決方案都應該避免「IndexMissingException [[events] missing]」錯誤。

1

如果您修改配置,可能會發生這種情況。如果您定義了一個,請嘗試刪除Tire.configure。