2012-11-17 7 views
3

"twitter_user"및 "twitter_comments"라는 테이블이 2 개 있다고 가정합니다. 사용자 이름과 바이오 twitter_comments이 필드가 있습니다 :탄성 검색에서 일대 다 관계

twitter_users이 필드가 사용자 이름과

분명히 언급, 사용자는

내가 원하는 twitter_comments 1 개 twitter_users의 항목 및 잠재적으로 많은있다 Elastic Search에서 twitter_users와 twitter_comments를 모두 모델링하면 쿼리 할 때 두 모델 모두에서 ES를 검색하게됩니다. 즉, 트위터 사용자에 대한 전체 관련성 점수에 대한 코멘트가 포함됩니다.

저는 모든 코멘트가 연결되어있는 단일 추가 필드 (사용자 이름과 약력 외에)를 만들어서 단 하나의 모델로 이것을 모방 할 수 있음을 알고 있습니다. 그러나 또 다른 "깨끗한"방법이 있습니까?

답변

8

에 따라 다릅니다.

{ 
    "user" : { 
     "username" : "TestUser", 
     "bio" : "whatever", 

     "comments" : [ 
     { 
      "title" : "First comment", 
      "text" : "My 1st comment" 
     }, 
     { 
      "title" : "Second comment", 
      "text" : "My 2nd comment" 
     } 
     ] 
    } 
} 

경우 :

당신은 단지 사용자의 의견, 전체 텍스트 검색 및 모든 분야에 걸쳐, 단순히 사용자 개체 내의 모든 의견 (무엇을 연결할 필요가 없습니다)를 저장 할 수있게하려면

주석을 nested (데이터를 제출하기 전에)으로 매핑해야하는 주석 단위의 쿼리가 필요하므로 모든 주석이 단일 항목으로 처리됩니다.

점수를 얻으려면 "comment_count"필드를 추가하고이를 부스트/점수에 사용하기 만하면됩니다.

2

Thorsten이 이미 중첩 쿼리를 사용할 수 있다고 제안 했으므로 좋은 접근 방법입니다.

또는 사용자의 의견으로 색인을 색인 할 수 있습니다. 그러면 지금까지처럼 사용자를 검색하고 top_children 검색어를 사용하여 검색어를 검색하여 검색 의견과 관련된 모든 항목을 찾고 마지막으로 bool 또는 dis_max 검색어를 사용하여 두 항목의 점수를 결합 할 수 있습니다.

중첩 된 접근 방법이 검색 중에 더 효율적이지만 추가 주석이 추가 될 때마다 사용자와 모든 주석을 다시 색인해야합니다. 자녀/부모 접근 방식을 사용하면 새로운 주석 만 색인화해야하지만 검색 속도가 느려지고 더 많은 메모리가 필요합니다.