2016-07-07 4 views
0

집계가있는 탄성 검색 쿼리를 실행 중이며,이를 100 레코드로 제한하려고합니다. 문제는 "크기"필터를 적용하더라도 집계에 아무런 영향이 없다는 것입니다. 당신이 집합이 수행 될 기록 제한에 영향이 없다시피탄성 검색 집계 된 레코드 제한

GET /index_name/index_type/_search 
{ 
    "size":0, 
    "query":{ 
    "match_all": {} 
    }, 
    "aggregations":{ 
    "courier_code" : { 
     "terms" : { 
     "field" : "city" 
     } 
    } 
}} 

결과 집합

{ 
    "took": 7, 
    "timed_out": false, 
    "_shards": { 
    "total": 10, 
    "successful": 10, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 10867, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "city": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "Mumbai", 
      "doc_count": 2706 
     }, 
     { 
      "key": "London", 
      "doc_count": 2700 
     }, 
     { 
      "key": "Patna", 
      "doc_count": 1800 
     }, 
     { 
      "key": "New York", 
      "doc_count": 1800 
     }, 
     { 
      "key": "Melbourne", 
      "doc_count": 900 
     } 
     ] 
    } 
    } 
} 

이다. Elastic Search의 상위 100 개 레코드에 대한 필터가 있습니까?

답변

1

elasticsearch의 검색 작업은 두 단계 queryfetch에서 수행됩니다. 첫 번째 단계에서 elasticsearch는 모든 샤드의 결과를 정렬하고 반환 할 레코드를 결정합니다. 이 레코드는 두 번째 단계에서 검색됩니다. size 매개 변수는 응답에서 사용자에게 반환되는 레코드 수를 제어합니다. 집계는 elasticsearch가 검색해야 할 레코드를 실제로 알기 전에 첫 번째 단계에서 실행되며 검색의 모든 레코드에서 항상 실행됩니다. 따라서 총 결과 수로는이를 제한 할 수 없습니다. 집계 실행의 범위를 제한하려면 검색 매개 변수를 변경하는 대신 검색 쿼리를 제한해야합니다. 예를 들어 작년의 레코드 만 포함하는 필터를 검색 쿼리에 추가하면 집계가이 필터에서 실행됩니다.

그것은 terminate_after 매개 변수를 사용하여 각 파편에 분석 레코드의 수를 제한 할 수도 있습니다,하지만 당신은이 기록이 포함됩니다되는 통제 할 수 없으며 어떤 기록하는 결과에 포함되지 않을 것이다, 그래서 옵션은 당신이 원하는 것이 아닌 것 같습니다.