2015-01-29 2 views
1
다음

는 샘플 데이터입니다 :elasticsearch를 사용하여 결과별로 그룹에서 일부 단어를 검색하는 방법은 무엇입니까?

{"blog_id": 1, "comments": "Apple", "comment_id": 1} 

그리고 #1#2 블로그, 완전히이 type blog_comments에서 6 개의 코멘트가 값 : type blog_comments에서

, 나는 그 구조가이 같은 일부 의견 데이터를 가지고 :

{"blog_id": 1, "comments": "Apple", "comment_id": 1} 
{"blog_id": 1, "comments": "Orange", "comment_id": 2} 
{"blog_id": 1, "comments": "Fruit", "comment_id": 3} 
{"blog_id": 2, "comments": "Apple", "comment_id": 1} 
{"blog_id": 2, "comments": "Orange", "comment_id": 2} 
{"blog_id": 2, "comments": "Earth", "comment_id": 3} 

Question: Is it possible using some "magic" queries to get # 1 # 2 as the result when I searching "Apple Fruit" and getwhen I search "Apple Earth" ?

각 블로그에 대해 모든 댓글을 하나의 새 레코드 (새 유형)에 추가 한 다음이 새로운 유형에 대한 검색을 수행 할 것을 고려하고 있습니다. 그러나 너무 많은 의견 (약 12,000,000 개의 의견)이 있으며 이러한 의견은 이미 탄성 검색 검색에 색인되어 있으므로 가능한 한이 데이터를 사용하는 것이 좋습니다.

답변

0

이상적으로, 하나의 블로그 게시물에서 모든 댓글을 검색 할 수 있도록 색인의 매핑을 변경해야합니다. 문서를 실제로 검색 할 수없고 한 번에 여러 문서에서 일치하는 특정 블로그 ID (문서의 필드)가 있다고 말할 수는 없습니다. Elasticsearch는 여러 문서가 아닌 여러 문서에서 일치하는 방법을 알고 있습니다.

한 가지 해결 방법이 있습니다. 그러나 그것은 블로그 ID를 되 찾는 것 외에는이 쿼리로 무엇을해야하는지에 달려 있습니다.

GET /blog/entries/_search?search_type=count 
{ 
    "query": { 
    "match": { 
     "comments": "Apple Earth" 
    } 
    }, 
    "aggs": { 
    "unique": { 
     "terms": { 
     "field": "blog_id", 
     "min_doc_count": 2 
     } 
    } 
    } 
} 

위의 쿼리는 다음과 같이 뭔가를 반환합니다 쿼리의

"aggregations": { 
     "unique": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": 2, 
       "doc_count": 2 
      } 
     ] 
     } 
    } 

아이디어는 (buckets에서 "key":2) 단지 blog_id 반환하는 것입니다, 그래서 당신이 유형 terms의 집계를 참조하십시오. 검색하는 단어의 수에 따라 (Apple Earth은 두 단어로 계산됩니다) min_doc_count을 검색어의 수로 설정합니다. 의미, 당신은 최소한 두 개의 문서에서 apple earth을 검색하려고한다고 말합니다. 예와 실제로 다른 점은 에 대해 apple earth, 하나의 문서에는 apple, 다른 하나는 earth 인 문서 만 반환한다는 것입니다.

하지만 내가 말했듯이 색인의 매핑을 변경하고 싶을 것입니다.

관련 문제