'aggregation'에 해당되는 글 12건

  1. 2022.07.18 [Elasticsearch] Filter Aggregation 사용하기.
  2. 2022.07.14 [Elasticsearch] Text Analysis, Performance Aggs.
  3. 2022.03.24 [Elasticsearch] Terms + Sub Sum Aggs 사례.
  4. 2022.01.28 [Elasticsearch] Aggs - Cardinality, Derivative, Cumulative...
  5. 2021.09.01 [Elasticsearch] Sum Aggs vs Stats Aggs ...
  6. 2017.02.09 [Kibana] Unique Count 사용 시 threshold 스크립트 추가.
  7. 2016.06.20 [Elasticsearch] Aggregation name ?
  8. 2015.10.30 [Review] Modeling data for fast aggregations - on Elastic's Blog
  9. 2015.09.16 [Elasticsearch] Part 2.0: The true story behind Elasticsearch storage requirements
  10. 2015.08.20 [Elasticsearch] SearchType.SCAN 사용 시 Aggregation 할 수 있나요?

[Elasticsearch] Filter Aggregation 사용하기.

Elastic/Elasticsearch 2022. 7. 18. 18:50

보통 Query 절에서 문서를 필터링 하고 Aggs 에서 집합/분석 질의를 하게 됩니다.

이 경우 성능적 잇점을 가져 가기 위해서는 보통 아래 두 가지 설정만 잘 사용 하면 됩니다.

 

1. Query 절은 Non-Scoring 질의를 사용하고

2. Size 파라미터 값을 0 으로 사용하고

 

그 이외는 기본적으로 Elasticsearch 에서  Cache 기능이 잘 동작 하기 때문에 크게 고민을 하지 않으셔도 어느 정도의 성능은 나온다고 보시면 됩니다.

 

Bucket Aggregation 중 Query 절에서 Filtering 하는 것과 같은 기능이 있어서 문서 링크와 주의 사항(?) 올려 봅니다.

 

아래 두 질의는 같은 결과를 리턴 합니다.

 

Case 1)

POST /sales/_search?size=0&filter_path=aggregations
{
  "query": { "term": { "type": "t-shirt" } },
  "aggs": {
    "avg_price": { "avg": { "field": "price" } }
  }
}

 

Case 2)

POST /sales/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "t_shirts": {
      "filter": { "term": { "type": "t-shirt" } },
      "aggs": {
        "avg_price": { "avg": { "field": "price" } }
      }
    }
  }
}

여기서 C1, C2 중 어떤게 좀 더 성능적으로 우세 할까요?

공홈 문서에 따르면 Sub Aggregation. 을 가지는 Filter Aggregation 보다는 Top Level Query 를 사용하는게 더 빠르다고 합니다.

그리고 다수의 Filter Aggregation 을 사용 하는 것 보다는 Filters Aggregation 을 사용 하는게 더 빠르다고 하니 참고 해서 사용 하시기 바랍니다.

 

제가 사용 한다고 하면 Top Level Query 에 Filter Query 나 Non-Scoring Query 를 이용해서 사용 할 것 같습니다.

 

 

 

:

[Elasticsearch] Text Analysis, Performance Aggs.

Elastic/Elasticsearch 2022. 7. 14. 19:32

Aggregation 기능을 이용해서 Text 분석을 하고 싶을 때가 있습니다.

X-pack basic 범위에서 가능 하면 더 좋겠죠.

 

아래 공홈 문서 보시고 참고해 보시면 좋을 것 같습니다.

 

 - Text Analysis
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-categorize-text-aggregation.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-multi-terms-aggregation.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-rare-terms-aggregation.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significanttext-aggregation.html

- Aggs Performance
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html

:

[Elasticsearch] Terms + Sub Sum Aggs 사례.

Elastic/Elasticsearch 2022. 3. 24. 18:13

문제)

하루 동안 데이터 요청을 가장 많이한 IP Top 5 를 구하시오.

 

해결)

GET /kibana_sample_data_logs/_search
{
  "size":0,
  "aggs": {
    "ip_aggs": {
      "terms": {
        "field": "ip"
      },
      "aggs": {
        "sum_aggs": {
          "sum": {
            "field": "bytes"
          }
        },
        "sum_aggs_sort": {
          "bucket_sort": {
            "sort": [
              { "sum_aggs": { "order": "desc" } } 
            ],
            "size": 5
          }
        }
      }
    }
  }
}

 

관련 문서)

https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-bucket-terms-aggregation.html

https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-pipeline-bucket-sort-aggregation.html

 

Elasticsearch 를 설치 하고 Kibana 를 이용해서 Sample Data 를 이용하였습니다.

그냥 Single node 로 구성 해서 테스트 해보실 수 있습니다.

:

[Elasticsearch] Aggs - Cardinality, Derivative, Cumulative...

Elastic/Elasticsearch 2022. 1. 28. 11:37

공식 문서)

Cardinality aggregation | Elasticsearch Guide [7.16] | Elastic

Derivative aggregation | Elasticsearch Guide [7.16] | Elastic

Cumulative cardinality aggregation | Elasticsearch Guide [7.16] | Elastic

 

현재 값과 직전 값에 대한 차이를 구합니다.

공식 문서에 자세한 내용들이 나와 있으니 보시면 좋습니다.

 

제가 사용 했던 예제는 공식 문서에 있는 거 활용 했습니다.

 

DAU 를 cardinality aggs 로 구하고 

Daily DAU 에 대한 누적 카운트를 cumulative_cardinality aggs 로 구하고 (여기서 buckets_path 는 cardinality aggs) 

Daily DAU 에 대한 변화를 derivative aggs 로 구했습니다. (여기서 buckets_path 는 cumulative_cardinality aggs)

 

아래는 공식 문서 예제 올려 둔 내용입니다.

GET /user_hits/_search
{
  "size": 0,
  "aggs": {
    "users_per_day": {
      "date_histogram": {
        "field": "timestamp",
        "calendar_interval": "day"
      },
      "aggs": {
        "distinct_users": {
          "cardinality": {
            "field": "user_id"
          }
        },
        "total_new_users": {
          "cumulative_cardinality": {
            "buckets_path": "distinct_users" 
          }
        }
      }
    }
  }
}

 

:

[Elasticsearch] Sum Aggs vs Stats Aggs ...

Elastic/Elasticsearch 2021. 9. 1. 14:41

코드만 봤을 때는 sum 보다 stats 가 느려야 하는게 정상으로 보입니다.

실제 문서의 구조와 질의를 어떻게 사용 했는지를 모르는 상황에서는 sum 보다 stats 가 빠르다는 부분에 대해서는 판단 하기가 어렵네요.

 

일단 sum, stats 와 같은 aggs 를 잘 사용하기 위해서는 아래 내용 정도 인지 하고 사용 하시면 좋을 것 같아 기록해 봅니다.

 

  • field data 유형이 numeric, geopoint, range 그 이외 유형이거나 null 이 아니도록 처리 합니다.
  • null 에 대한 처리를 위해 missing parameter 를 적용 합니다.
  • if else 구조로 성능 이슈 있을 수 있습니다.
:

[Kibana] Unique Count 사용 시 threshold 스크립트 추가.

Elastic/Kibana 2017. 2. 9. 12:54

기억력 극복을 위해 또 기록해 봅니다.


elasticsearch의 cardinality aggregation 을 kibana 에서는 unique count 로 사용 합니다.

여기에 정확도 조절을 위해 precision_threshold 를 설정할 수 있는데요.


참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html


QueryDSL)

{
    "aggs" : {
        "author_count" : {
            "cardinality" : {
                "field" : "author_hash",
                "precision_threshold": 100 
            }
        }
    }
}



Kibana Script)

{

"precision_threshold":40000

}


위와 같이 사용하시면 됩니다.

주의 하실 부분은 CPU와 Memory 사용에 민감하고 circuit breaker 설정도 확인하셔야 합니다.


:

[Elasticsearch] Aggregation name ?

Elastic/Elasticsearch 2016. 6. 20. 18:09

aggregation 을 많이 사용하시는 분들은 잘 아실것 같구요.

그냥 기본만 사용하시는 분들에게는 생소할 수 있어서 그냥 정리해 봤습니다.


참고문서)

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/search-aggregations.html#_structuring_aggregations


"aggregations" : { "<aggregation_name>" : { "<aggregation_type>" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggregations" : { [<sub_aggregation>]+ } ]? } [,"<aggregation_name_2>" : { ... } ]* 

}


여기서 "<aggregation_name>" 에 대한 내용입니다.

이 값은 기본적으로 aggs 수행 후 return 될 때 사용되는 변수명을 지정하게 됩니다.

간혹 aggregation_name 에 field 명을 주시는 경우가 있을 수 있는데요. 안되는 것은 아니지만 해당 변수에 대한 정확한 용도를 알고 사용하시면 더 좋겠다 싶어서 글 남겨 봤습니다.


/**

 * Constructs a new aggregation builder.

 *

 * @param name  The aggregation name

 * @param type  The aggregation type

 */

public AggregationBuilder(String name, Type type) {

    if (name == null) {

        throw new IllegalArgumentException("[name] must not be null: [" + name + "]");

    }

    if (type == null) {

        throw new IllegalArgumentException("[type] must not be null: [" + name + "]");

    }

    this.name = name;

    this.type = type;

}


...중략...


@Override

public final XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {

    builder.startObject(name);


    if (this.metaData != null) {

        builder.field("meta", this.metaData);

    }

    builder.field(type.name());

    internalXContent(builder, params);


    if (factoriesBuilder != null && (factoriesBuilder.count()) > 0) {

        builder.field("aggregations");

        factoriesBuilder.toXContent(builder, params);


    }


    return builder.endObject();

}


소스 코드를 보셔도 아시겠죠?

XContentBuilder 에서 최상위 object name 에 aggregation_name 값을 지정하고 있습니다.


그냥 제가 기억하기 위해 글 남기고 마무리 하겠습니다.


:

[Review] Modeling data for fast aggregations - on Elastic's Blog

Elastic/Elasticsearch 2015. 10. 30. 11:43

elastic blog에 올라온 글에 대한 개인 리뷰 입니다.

그냥 정리 차원에서 작성해 보겠습니다.


[원문]

https://www.elastic.co/blog/modeling-data-for-fast-aggregations


글 제목이나 링크만 봐도 어떤 내용인지 감이 오실 겁니다.

"aggregation 성능을 올리기 위한 모델링"

딱 봐도 끌리는 제목이죠.


이 글에서 제시해 주는 건 단순 명료 합니다.

query와 aggregation 조건에 대한 attribute 를 각 문서에 미리 정의를 해 두는 것으로 aggregation operation 수를 줄여 주는 것입니다.

문서에서는 6번의 aggregation operations를 attribute 설정을 통해 2번의 aggregation operations 수행으로 줄어든 것을 확인 시켜 주고 있습니다.


당연히 색인시점에 query, aggregation 조건을 분리해서 문서에 대한 attribute 설정을 하고 색인을 해야 합니다.

즉, 여기서 단점이 바로 보이시죠.

문서에도 나와 있습니다.

조건이 변경 되면 reindexing 을 해야 한다는 것입니다.


잘 아시겠지만 모든 요건을 만족하는 그런 아키텍쳐도, 모델링도 저는 보지 못한 것 같습니다.

항상 그렇지만 연구하고 요건을 충족 시킬수 있는 구성과 모델이 뭔지 실험하고 적용해 보지 않고서는 답을 찾을 수 없지 않을까 생각 합니다.


정리하면,

pre-compute 를 통한 문서의 attribute 정보 추가로 aggregation 수를 줄여 수행 성능을 빠르게 할 수 있다는 것입니다.


:

[Elasticsearch] Part 2.0: The true story behind Elasticsearch storage requirements

Elastic/Elasticsearch 2015. 9. 16. 10:39

원본글)


한 줄 요약)

doc_values 와 index.codec 설정을 사용하면 좋다!!


storage 용량을 압축을 통해서 15 ~ 25% 정도 절약 할 수 있다는 이야기 입니다.

더불어 주의 하셔야 할 점은 decompression 시 penalty 가 있다는 이야기도 있습니다. 

해결 방법(?)도 제시해 주고 있는데요. 

size 파라미터를 이용해서 size=0 으로 해서 사용하시면 됩니다.


압축 옵션의 경우 색인 시에는 성능 저하는 크기 않지만 질의 시에는 성능 저하가 있을 수 있습니다.


:

[Elasticsearch] SearchType.SCAN 사용 시 Aggregation 할 수 있나요?

Elastic/Elasticsearch 2015. 8. 20. 12:40

제가 분석하고 결과를 정리해 두고도 같은 실수를 하게 되내요.

별 내용은 아닙니다.

단순 정보의 보관 및 찾아보기 용으로 기록해 둡니다.


SearchType.SCAN 사용 시 Aggregation 기능은 사용 할 수 없습니다.


다만, 혼동하는 이유는 QueryDSL 작성 시 작성이 가능 하기 때문에 되는 것 처럼 착각을 하게 되는 것이구요.

실제 작성해서 실행 시켜 보면 아래와 같은 에러를 경험하게 됩니다.


[에러내용]

ElasticsearchIllegalArgumentException[aggregations are not supported with search_type=scan]


혹시라도 잘 못 알고 계시는 분들은 저 처럼 실수 하지 마시기 바랍니다. :)

: