2012-04-19 5 views
6

MongoDB에 저장된 검색을 위해 ElasticSearch + Tire를 사용하고 싶습니다.루비 : ElasticSearch + 타이어 오류 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

모델을 업데이트하십시오. 거기에 '필드'정의가 없습니다. 전체적으로, 앱을로드 할 때 이미 존재하지 않는 한 앱을 만들어야합니다. – 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 => : 탄성 검색도

내가 내 모델

내림차순 "색인화 이벤트"
작업을 인덱싱하는 레이크 작업이 경기장 인덱스를 찾고 있습니다 끝

+0

흥미롭게도, 번들 된 임포트 레이크 작업이 짧지는 않습니까? – karmi

+0

@ Andrew : 죄송합니다. Venue 모델로도 테스트하려고 했으므로 잘못된 오류 메시지가 복사되었습니다. 그것은 [[events] missing]이라고 말했어야만합니다. 이를 반영하기 위해 위의 질문을 업데이트했습니다. – gabriel

+0

'rake db : mongoid : create_indexes'와'rake environment tire : import CLASS = 'Event''를 시도했지만 작동하지 않는 것 같습니다. 매우 실망 스럽습니다. 어떤 도움이라도 대단히 감사하겠습니다. – gabriel

3

초기화 프로그램 설정 (다음은 컴퓨터 및 영웅 분재와이 부가 기능도 단지의 경우 ...) : 다음

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와 레일 콘솔을 열고 실행합니다 : 모델에서

# 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를 추가

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의 협약을 훌륭히 수행하기 위해 초기 색인 색인 추가 기능을 느슨하게했습니다. –

12

... 또는, 단지 실행

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

을 ... 참조 :

Event.index.import Event.all 

이 방법을 모든 레코드를 JSON으로 직렬화, 메모리에로드 및 전송 ElasticSearch로 연결합니다. 이전과 마찬가지로 두 가지 해결책은 "IndexMissingException [[events] missing]"오류를 피할 수 있습니다.

1

구성을 수정하면 이러한 현상이 발생할 수 있습니다. Tire.configure를 정의한 경우 제거하십시오.

관련 문제