'terms'에 해당되는 글 3건

  1. 2022.03.24 [Elasticsearch] Terms + Sub Sum Aggs 사례.
  2. 2021.10.27 [Elasticsearch] Term vs Terms Query
  3. 2016.05.24 [Elasticsearch] BoolQueryBuilder + TermsQueryBuilder 사용 시 minimum_should_match와 min_should_match

[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] Term vs Terms Query

Elastic/Elasticsearch 2021. 10. 27. 16:14

보셔야 하는 클래스는

- TermQueryBuilder

- TermsQueryBuilder

입니다.

 

두 Query 의 큰 차이는 단독으로 사용 되었을 때 Scoring 이 어떻게 되느냐 인데요.

Term 은 Score 계산이 되어서 나오고 Terms 는 Constant Score Query 처럼 1.0 으로 나온다는 것입니다.

 

코드를 좀 더 따라 가다 보면 

- MapperFieldType

클래스 내 Query API 들에 대한 Interface 나 Implement 코드를 확인해 보실 수 있습니다.

 

아래는 Terms Query 에 대한 코드를 가져온 내용입니다.

    /** Build a constant-scoring query that matches all values. The default implementation uses a
     * {@link ConstantScoreQuery} around a {@link BooleanQuery} whose {@link Occur#SHOULD} clauses
     * are generated with {@link #termQuery}. */
    public Query termsQuery(Collection<?> values, @Nullable SearchExecutionContext context) {
        BooleanQuery.Builder builder = new BooleanQuery.Builder();
        for (Object value : values) {
            builder.add(termQuery(value, context), Occur.SHOULD);
        }
        return new ConstantScoreQuery(builder.build());
    }

뭐 혼자 기억 하기 위한 기록 이라서 이 정도까지만 기록해 두겠습니다.

 

:

[Elasticsearch] BoolQueryBuilder + TermsQueryBuilder 사용 시 minimum_should_match와 min_should_match

Elastic/Elasticsearch 2016. 5. 24. 18:11

이게 또 언제 변수명이 바뀌었을까요?

버전 릴리즈 될때마다 소스코드를 다 따라 갈수가 없다 보니 이런 오류를 경험하게 되내요.


주의) min_should_match 는 java api 를 이용해서는 사용 할 수 없습니다.


[Terms Query]

이 쿼리는 field 에 여러개의 term 을 넣어서 질의 할 수 있도록 해줍니다.

그래서 기본 or 검색을 지원하고 있구요. 여기서 and 연산을 하고 싶으면 terms query 에 아래 변수 값을 지정 하셔야 합니다.


min_should_match:TERM_SIZE


OR)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "terms": {

           "title": [

              "포니",

              "이펙트"

           ],

           "min_should_match": 1

        }                

    }

}'



AND)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "terms": {

           "title": [

              "포니",

              "이펙트"

           ],

           "min_should_match": 2

        }                

    }

}'


[Bool Query + Terms Query]

이 쿼리는 compound query 작성을 위해 많이 사용하는 것입니다.

bool query 안에 terms query 를 섞어 사용하는 것이구요. 좀 더 and, or 연산을 다양하게 할 수 있게 해줍니다.

여기서는 miminum_should_match 를 통해서 and, or 연산을 해야 하는데 terms query 에서의 min_should_match 를 사용하지 않게 되면 정상적인 결과를 얻을 수 없게 됩니다. (아무래도 2.3.3 에서 5.0 으로 넘어가는 과도기라 그런게 아닌가 싶습니다.)

should 를 여러개 사용할 경우 miminum_should_match 설정을 하셔야 합니다.


OR)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "bool" : {

            "should": [

               {

                   "terms": {

                      "title": [

                         "포니",

                         "이펙트"

                      ],

                      "min_should_match": "1"

                   }

               }

            ]

        }

    }

}'


AND)

curl -XGET "http://localhost:9200/_search?pretty" -d'

{

    "size": 10,

    "query" : {

        "bool" : {

            "should": [

               {

                   "terms": {

                      "title": [

                         "포니",

                         "이펙트"

                      ],

                      "min_should_match": "2"

                   }

               }

            ]

        }

    }

}'


: