2017-04-12 8 views
1

ElasticSearch 설명서에서 the example과 비슷한 집계를 분할하려하지만 예제가 작동하지 않습니다.그룹으로 그룹화하는 파티션

public class Event 
{ 
    public int EventId { get; set; } 
    public string SegmentId { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

EventId 고유 각 이벤트는 특정 SegmentId 속한다 :

인덱스는 이벤트 유형 채워져있다. 각 SegmentId는 0에서 많은 이벤트와 연관 ​​될 수 있습니다.

질문 : 가 어떻게 각 SegmentId에 대한 최신 EventId을받을 수 있나요?

고유 한 세그먼트의 수가 10 백만 개가되고 고유 한 이벤트의 수가 1 ~ 2 개 더 커질 것으로 예상됩니다. 그렇기 때문에 top_hits을 단독으로 사용하는 것이 적절하지 않다고 생각합니다. suggested here. 따라서 파티셔닝.

예 : I (101)가 별개 SegmentId (즉, 세그먼트 당 13 건)에 속하는 (EventId 고유) 1,313 문서 채워 데모 인덱스를 설정

. 아래의 쿼리가 작동 할 것으로 기대하지만 정확한 숫자는 partition 숫자와 관계없이 반환됩니다. 나는 include를 제거하고보다 큰 값 (101)에 size을 설정하면

POST /demo/_search 
{ 
    "size": 0, 
    "aggs": { 
    "segments": { 
     "terms": { 
     "field": "segmentId", 
     "size": 15,     <-- I want 15 segments from each query 
     "include": { 
      "partition": 0,   <-- Trying to retrieve the first partition 
      "num_partitions": 7  <-- Expecting 7 partitions (7*15 > 101 segments) 
     } 
     }, 
     "aggs": { 
     "latest": { 
      "top_hits": { 
      "size": 1, 
      "_source": [ 
       "timestamp", 
       "eventId", 
       "segmentId" 
      ], 
      "sort": { 
       "timestamp": "desc" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

, 나는 모든 세그먼트에 대한 최신 이벤트를 얻을. 그러나 나는 그것이 백만 개의 양동이가있는 좋은 방법이라고는 생각하지 않습니다 ...

답변

0

잘못된 질문을 조사하고있는 것으로 나타났습니다. 예제는 실제로 완벽하게 작동합니다.

문제는 로컬 ElasticSearch 노드입니다. 무엇이 잘못되었는지는 모르지만 다른 컴퓨터에서 예제를 반복하면 효과가있었습니다. 그러나 현재의 ES 설치에서 파티션 작업을 수행 할 수 없었습니다. 따라서 ElasticSearch를 제거하고 다시 설치 한 다음 예가 작동했습니다.

내 원래의 질문에 대한 답변을 보려면 제공된 예제를 참조하십시오. 나는 cardinality aggregate을 사용하여 총 제품 수에 대한 추정치를 얻고 적절한 파티션 수를 도출하여 문제를 해결했습니다. 그런 다음 각 파티션에 대해 위의 쿼리를 반복하고 문서를 최종 목록에 추가했습니다.

1

집합의 Scroll을 시도하고 있습니다.

Scroll API는 검색 쿼리에만 지원되며 집계에는 지원되지 않습니다. 당신은 당신이 언급 한대로 최고 인해 문서의 거대한 숫자로, 조회수 사용하지 않으려면, 당신은 시도 할 수 있습니다 :

  1. Parent/Child 접근을 - 당신은 부모 문서와 이벤트로 세그먼트을 만들 경우 자식 문서에서. 그리고 자식을 추가 할 때마다 부모 문서의 타임 스탬프 필드를 업데이트 할 수 있습니다. 이렇게하면 상위 문서를 쿼리 할 수 ​​있으며 세그먼트 ID + 마지막 이벤트 타임 스탬프를 갖게됩니다.

  2. 또 다른 방법은 최근 24 시간 동안 만 조회수를 늘리는 것입니다. 따라서 쿼리를 추가하여 처음 24 시간 동안 필터링 한 다음 top_hit을 사용하여 agg를 가져 오려고 시도 할 수 있습니다.

+0

내가 원했던 것은 집계에 대한 스크롤이었습니다. 이는 지원되지 않습니다. 그러나, 나는 그것을 파티션으로 해결했다. (필자의 대답을 보라). 그래도 제안 해 주셔서 감사합니다! 다른 상황에서 유용 할 수도 있습니다! (: – Reyhn