2012-11-21 2 views
1

Elasticsearch 및 Tire를 기반으로 한 전체 텍스트 검색을 사용하는 레일 앱이 이미 Category라는 MongoDB 모델에서 작동하지만 이제는 복잡한 검색은 MongoID Embedded 1-n 모델을 사용하는 embeds_many에 따라 : 주시 이제 Tires on Rails 대량 가져 오기 및 인덱싱 문제가있는 Elasticsearch

내가 관심 목록에서 대량 가져 오기 및 인덱싱 모든 분야에 있고, 내가 알고 싶습니다
  1. 내가 그걸 어떻게 할 수

    를?
  2. 은 사용자 상위 필드없이 watchlists 하위 필드 만 색인 할 수 있습니까?

    응용 프로그램/모델/user.rb (부모) :

임베디드 1-N MongoDB를/MongoID 모델은 다음과 같습니다

class User 
    include Mongoid::Document 

    include Tire::Model::Search 
    include Tire::Model::Callbacks 
    index_name 'users' 

    field :nickname 
    field ... many others 

    embeds_many :watchlists 
end 

응용 프로그램/모델/watchlist.rb (임베디드 "많은"어린이) :

class Watchlist 
    include Mongoid::Document 

    include Tire::Model::Search 
    include Tire::Model::Callbacks 
    index_name 'watchlists' 

    field :html_url 
    embedded_in :user 
end 

작업을 수행하는 방법에 대한 제안이 있으십니까? UPDATE

:

... "tags_array", "html_url", "description", "forks" 
: 여기
이 모델의 덩어리가 몽고에 볼이

> user = db.users.findOne({'nickname': 'lgs'}) 
    { 
     "_id" : ObjectId("4f76a16cf2a6a12f88cbca43"), 
     "encrypted_password" : "", 
     "sign_in_count" : 0, 
     "provider" : "github", 
     "uid" : "1573", 
     "name" : "Luca G. Soave", 
     "email" : "[email protected]", 
     "nickname" : "lgs", 
     "watchlists" : [ 
      { 
       "_id" : ObjectId("4f76997f1d41c81173000002"), 
       "tags_array" : [ git, peristence ], 
       "html_url" : "https://github.com/mojombo/grit", 
       "description" : "Grit gives you object oriented read/write access to Git repositories via Ruby.", 
       "fork_" : false, 
       "forks" : 207, 
       "watchers" : 1258, 
       "created_at" : ISODate("2007-10-29T14:37:16Z"), 
       "pushed_at" : ISODate("2012-01-27T01:05:45Z"), 
       "avatar_url" : "https://secure.gravatar.com/avatar/25c7c18223fb42a4c6ae1c8db6f50f9b?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png" 
      }, 
     ... 
     ... 
    } 

내가 & 쿼리에 포함 된 자녀가 소유 한 필드를 인덱스하고 싶습니다 쉘은 문서 주시

하지만 elasticsearch에 상위 사용자 입력란을 포함하지 않으려합니다.

... "uid", "name", "email", "nickname" 

그래서 "git persistence"를 쿼리하면 원래 MongoDB의 각 '사용자'의 각 'watchlists'색인 필드를 조사하게됩니다.

(여기 단수와 복수형을 일치하지 미안, 난 그냥 문서 개체 이름을 표시했다)

정말 당신이 그 (것)들을 조회 할 방법에 따라, 검색 엔진에 대한 데이터를 직렬화하는 방법에 따라 달라집니다
+0

안녕하세요. – karmi

+0

@karmi 모든 것이 고마워, ... 나는 방금 업데이트하고 깃발을 놓는 것을 잊었다. 기본적으로 문서의 임베디드 된 자식 부분을 인덱싱하는 작업은 다음과 같습니다. RAILS_ENV = 프로덕션 레이크 환경 타이어 : import CLASS = 감시 목록 FORCE = true –

+0

잘 알고있어서 기쁩니다! – karmi

답변

3

. 질문을 업데이트하면 답변이 업데이트됩니다. (또한 ES 로그를 제거하는 것이 좋습니다. 여기서는 관련성이 없습니다.)

Rake 작업이 Mongo의 임베디드 문서와 어떻게 작동하는지, 그리고 왜 그것이 Mongo의 "hang" 종료. 작업을 실행할 때 데이터가 "사용자"색인에 있습니까?

레이크 작업이 충분히 유연하지 않은 경우 고유 한 인덱싱 코드를 제공하는 것이 매우 쉽습니다. Tire::Index#import 통합 테스트를 참조하십시오.