10 개가 아닌 모든 Elasticsearch 집계 결과 / 버킷 표시


166

집계에 모든 버킷을 나열하려고하지만 처음 10 개만 표시하는 것 같습니다.

내 검색 :

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0, 
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw"
         }
      }
   }
}'

보고:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 16920,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "bairro_count" : {
      "buckets" : [ {
        "key" : "Barra da Tijuca",
        "doc_count" : 5812
      }, {
        "key" : "Centro",
        "doc_count" : 1757
      }, {
        "key" : "Recreio dos Bandeirantes",
        "doc_count" : 1027
      }, {
        "key" : "Ipanema",
        "doc_count" : 927
      }, {
        "key" : "Copacabana",
        "doc_count" : 842
      }, {
        "key" : "Leblon",
        "doc_count" : 833
      }, {
        "key" : "Botafogo",
        "doc_count" : 594
      }, {
        "key" : "Campo Grande",
        "doc_count" : 456
      }, {
        "key" : "Tijuca",
        "doc_count" : 361
      }, {
        "key" : "Flamengo",
        "doc_count" : 328
      } ]
    }
  }
}

이 집계에 대해 10 개가 넘는 키가 있습니다. 이 예에서는 145 개의 키가 있고 각 키의 개수를 원합니다. 버킷에 페이지 매김이 있습니까? 나는 그들 모두를 얻을 수 있습니까?

Elasticsearch 1.1.0을 사용하고 있습니다

답변:


196

크기 매개 변수는 검색어 예제의 매개 변수 여야합니다.

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0,
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw",
             "size": 0
         }
      }
   }
}'

이 문서에서 언급했듯이 버전 1.1.0 이상에서만 작동합니다.

편집하다

@PhaedrusTheGreek 의견을 기반으로 답변을 업데이트합니다.

size:0카디널리티 필드 값이 높은 클러스터에서 발생하는 메모리 문제로 인해 설정 이 2.x 이상에서 더 이상 사용되지 않습니다. 여기 에서 github 문제 에서 더 자세히 읽을 수 있습니다 .

size1에서 2147483647 사이의 숫자에 대해 적절한 값을 명시 적으로 설정하는 것이 좋습니다 .


8
카디널리티 필드 값이 높은 클러스터에서 발생하는 메모리 문제로 인해 size : 0 설정이 더 이상 사용되지 않습니다. github.com/elastic/elasticsearch/issues/18838 . 대신, 1에서 2147483647 사이의 실제적이고 합리적인 숫자를 사용하십시오.
PhaedrusTheGreek

이것을 지적 해 주셔서 감사합니다 @PhaedrusTheGreek, 귀하의 의견을 반영하기 위해 답변을 편집했습니다.
keety

0은 2.5.2에서 일하고 있습니다. 2.x 이후의 의미는 무엇입니까? 버전 5 이후를 의미합니까? 또한 가능한 모든 agg를 반환하려는 경우 어떤 종류의 메모리 문제가 발생할 수 있는지 궁금합니다 .0 (max_value)과 10000 (일부 큰 상한) 설정의 차이점은 무엇입니까?
batmaci

4
@batmaci 그것은 사용되지 않습니다 2.x에서 여전히 작업을 것이고에서 제거 5.x를
keety

@batmaci size : <big number>의 사용은 메모리를 덜 사용하는 것이 아니라 성능 비용이 있다는 것을 클라이언트에게 더 명확하게 만듭니다. 나는 그것이 더 이상 사용되지 않는 이유라고 생각합니다 size:0. 이 github 이슈
keety

37

모든 버킷을 표시하는 방법?

{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "terms": {
        "field": "your_field",
        "size": 10000
      }
    }
  }
}

노트

  • "size":10000최대 10000 개의 버킷을 확보하십시오. 기본값은 10입니다.

  • "size":0결과적 "hits"으로 기본적으로 10 개의 문서가 포함됩니다. 우리는 그것들을 필요로하지 않습니다.

  • 기본적으로 버킷은 doc_count내림차순으로 정렬됩니다.


Fielddata is disabled on text fields by default오류가 발생합니까?

텍스트 필드에서는 기본적으로 fielddata가 비활성화되어 있기 때문입니다 . 필드 유형 맵핑을 wxplicitly 선택하지 않은 경우 문자열 필드에 대한 기본 동적 맵핑이 있습니다 .

따라서 글 "field": "your_field"을 쓰는 대신 을 가져야 "field": "your_field.keyword"합니다.


버킷의 크기가 더 크면 탄력적 검색 쿼리의 성능 (쿼리 실행 시간)에 영향을 줍니까?
user3522967

버킷에 페이지 매김을 어떻게 추가 할 수 있습니까?
Miind

7

용어 집계에서 크기 (2 번째 크기)를 10000으로 늘리면 크기가 10000 인 버킷을 얻게됩니다. 기본적으로 10으로 설정되어 있습니다. 또한 검색 결과를 보려면 첫 번째 크기 만 1로 설정하면됩니다. ES는 검색과 집계를 모두 지원하므로 1 문서를 참조하십시오.

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 1,
   "aggregations": {
      "bairro_count": {
         "terms": {
             "field": "bairro.raw",
             "size": 10000

         }
      }
   }
}'

4

매직 번호 ( size: 10000) 를 설정하지 않고 모든 고유 값 을 얻으려면 COMPOSITE AGGREGATION (ES 6.5+)을 사용하십시오 .

에서 공식 문서 :

"내포 된 용어 집계에서 모든 용어 또는 모든 용어 조합을 검색 하려면 용어 집계에서 필드의 카디널리티보다 큰 크기를 설정하는 대신 가능한 모든 용어에 대해 페이지 매김을 허용 하는 COMPOSITE AGGREGATION사용해야합니다 . 용어 집계는 최상위 용어를 반환하기위한 것이며 페이지 매김을 허용하지 않습니다. "

JavaScript의 구현 예 :

const ITEMS_PER_PAGE = 1000;

const body =  {
    "size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
    "aggs" : {
        "langs": {
            "composite" : {
                "size": ITEMS_PER_PAGE,
                "sources" : [
                    { "language": { "terms" : { "field": "language" } } }
                ]
            }
        }
     }
};

const uniqueLanguages = [];

while (true) {
  const result = await es.search(body);

  const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);

  uniqueLanguages.push(...currentUniqueLangs);

  const after = result.aggregations.langs.after_key;

  if (after) {
      // continue paginating unique items
      body.aggs.langs.composite.after = after;
  } else {
      break;
  }
}

console.log(uniqueLanguages);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.