아빠는 개발자

[es8] Top hits aggregation - 이론편 본문

ES8/elasticsearch8

[es8] Top hits aggregation - 이론편

father6019 2024. 10. 20. 18:11
728x90
반응형

Top hits aggregation

메트릭 top_hits애그리게이터는 가장 관련성 있는 문서를 집계하는 것을 추적합니다. 이 애그리게이터는 하위 애그리게이터로 사용되도록 의도되어 있으므로 버킷당 가장 일치하는 문서를 집계할 수 있습니다.

 

 

최상위 집계로는 권장하지 않고 collapse 파라미터를 사용하라..

 

Options

  • from- 가져오려는 첫 번째 결과로부터의 오프셋입니다.
  • size- 버킷당 반환할 상위 매칭 히트의 최대 수. 기본적으로 상위 3개 매칭 히트가 반환됩니다.
  • sort- 상위 매칭 히트를 정렬하는 방법. 기본적으로 히트는 주요 쿼리의 점수에 따라 정렬됩니다.

 

Supported per hit features

top_hits 집계는 정기적인 검색 결과를 반환하므로 많은 히트당 기능을 지원할 수 있습니다. 

 

제약이 은근 많네 

  

top_hits매개변수를 지원하지 않습니다 rescore. 쿼리 재점수는 검색 결과에만 적용되며 집계 결과에는 적용되지 않습니다. 집계에서 사용하는 점수를 변경하려면 function_score또는 script_score쿼리를 사용합니다.

 

다음 예에서 우리는 판매를 유형별로 그룹화하고 유형별로 마지막 판매를 보여줍니다. 각 판매에 대해 날짜와 가격 필드만 소스에 포함됩니다.

POST /sales/_search?size=0
{
  "aggs": {
    "top_tags": {
      "terms": {
        "field": "type",
        "size": 3
      },
      "aggs": {
        "top_sales_hits": {
          "top_hits": {
            "sort": [
              {
                "date": {
                  "order": "desc"
                }
              }
            ],
            "_source": {
              "includes": [ "date", "price" ]
            },
            "size": 1
          }
        }
      }
    }
  }
}

 

 

 

Possible response:

{
  ...
  "aggregations": {
    "top_tags": {
       "doc_count_error_upper_bound": 0,
       "sum_other_doc_count": 0,
       "buckets": [
          {
             "key": "hat",
             "doc_count": 3,
             "top_sales_hits": {
                "hits": {
                   "total" : {
                       "value": 3,
                       "relation": "eq"
                   },
                   "max_score": null,
                   "hits": [
                      {
                         "_index": "sales",
                         "_id": "AVnNBmauCQpcRyxw6ChK",
                         "_source": {
                            "date": "2015/03/01 00:00:00",
                            "price": 200
                         },
                         "sort": [
                            1425168000000
                         ],
                         "_score": null
                      }
                   ]
                }
             }
          },
          {
             "key": "t-shirt",
             "doc_count": 3,
             "top_sales_hits": {
                "hits": {
                   "total" : {
                       "value": 3,
                       "relation": "eq"
                   },
                   "max_score": null,
                   "hits": [
                      {
                         "_index": "sales",
                         "_id": "AVnNBmauCQpcRyxw6ChL",
                         "_source": {
                            "date": "2015/03/01 00:00:00",
                            "price": 175
                         },
                         "sort": [
                            1425168000000
                         ],
                         "_score": null
                      }
                   ]
                }
             }
          },
          {
             "key": "bag",
             "doc_count": 1,
             "top_sales_hits": {
                "hits": {
                   "total" : {
                       "value": 1,
                       "relation": "eq"
                   },
                   "max_score": null,
                   "hits": [
                      {
                         "_index": "sales",
                         "_id": "AVnNBmatCQpcRyxw6ChH",
                         "_source": {
                            "date": "2015/01/01 00:00:00",
                            "price": 150
                         },
                         "sort": [
                            1420070400000
                         ],
                         "_score": null
                      }
                   ]
                }
             }
          }
       ]
    }
  }
}

 

Field collapse example

 

필드 축소 또는 결과 그룹화는 논리적으로 결과 집합을 그룹으로 그룹화하고 그룹당 상위 문서를 반환하는 기능입니다. 그룹의 순서는 그룹의 첫 번째 문서의 관련성에 따라 결정됩니다. Elasticsearch에서 이는 top_hits하위 집계자로 집계자를 래핑하는 버킷 집계자를 통해 구현할 수 있습니다.

아래 예에서 우리는 크롤링된 웹페이지를 검색합니다. 각 웹페이지에 대해 우리는 본문과 웹페이지가 속한 도메인을 저장합니다. 필드 terms에 애그리게이터를 정의함으로써 domain우리는 도메인별로 웹페이지의 결과 세트를 그룹화합니다. top_hits그런 다음 애그리게이터는 하위 애그리게이터로 정의되므로 버킷당 가장 일치하는 히트가 수집됩니다.

또한, 집계기의 주문 기능 max을 사용하여 terms버킷에서 가장 관련성이 높은 문서를 관련성 순으로 반환하는 집계기가 정의됩니다.

 

POST /sales/_search
{
  "query": {
    "match": {
      "body": "elections"
    }
  },
  "aggs": {
    "top_sites": {
      "terms": {
        "field": "domain",
        "order": {
          "top_hit": "desc"
        }
      },
      "aggs": {
        "top_tags_hits": {
          "top_hits": {}
        },
        "top_hit" : {
          "max": {
            "script": {
              "source": "_score"
            }
          }
        }
      }
    }
  }
}
 

 

현재 max(또는 ) 애그리게이터는 애그리게이터의 버킷이 도메인당 가장 관련성 있는 웹페이지의 점수에 따라 정렬되도록 min하는 데 필요합니다 . 안타깝게도 애그리게이터는 아직 애그리게이터 옵션 에서 사용할 수 없습니다 .termstop_hitsorderterms

top_hits support in a nested or reverse_nested aggregator

애그리게이터가 또는 애그리게이터 top_hits에 래핑된 경우 중첩된 히트가 반환됩니다. 중첩된 히트는 매핑에서 중첩된 필드 유형이 구성된 일반 문서의 일부인 숨겨진 미니 문서입니다. 애그리 게이터는 또는 애그리게이터 에 래핑된 경우 이러한 문서를 숨김 해제할 수 있습니다 . 중첩된 유형 매핑 에서 중첩에 대해 자세히 알아보세요 .

nested

reverse_nested

top_hitsnested

reverse_nested

중첩 유형이 구성된 경우 단일 문서는 실제로 여러 Lucene 문서로 인덱싱되고 동일한 ID를 공유합니다. 중첩된 히트의 ID를 결정하려면 ID 외에도 더 많은 것이 필요하므로 중첩된 히트에도 중첩된 ID가 포함됩니다. 중첩된 ID는 _nested검색 히트의 필드 아래에 보관되고 배열 필드와 중첩된 히트가 속한 배열 필드의 오프셋이 포함됩니다. 오프셋은 0부터 시작합니다.

실제 샘플로 어떻게 작동하는지 살펴보겠습니다. 다음 매핑을 고려합니다.

 

PUT /sales
{
  "mappings": {
    "properties": {
      "tags": { "type": "keyword" },
      "comments": {                           
        "type": "nested",
        "properties": {
          "username": { "type": "keyword" },
          "comment": { "type": "text" }
        }
      }
    }
  }
}

 

 

 

PUT /sales/_doc/1?refresh
{
  "tags": [ "car", "auto" ],
  "comments": [
    { "username": "baddriver007", "comment": "This car could have better brakes" },
    { "username": "dr_who", "comment": "Where's the autopilot? Can't find it" },
    { "username": "ilovemotorbikes", "comment": "This car has two extra wheels" }
  ]
}
 
콘솔페소(PHP)파이썬루비가다자바스크립트

는 객체 comments아래에 중첩된 문서를 보관하는 배열입니다 product.

그리고 몇 가지 문서:

 

PUT /sales/_doc/1?refresh
{
  "tags": [ "car", "auto" ],
  "comments": [
    { "username": "baddriver007", "comment": "This car could have better brakes" },
    { "username": "dr_who", "comment": "Where's the autopilot? Can't find it" },
    { "username": "ilovemotorbikes", "comment": "This car has two extra wheels" }
  ]
}

 

 

이제 다음 top_hits집계를 실행할 수 있습니다( nested집계로 래핑됨):

 

POST /sales/_search
{
  "query": {
    "term": { "tags": "car" }
  },
  "aggs": {
    "by_sale": {
      "nested": {
        "path": "comments"
      },
      "aggs": {
        "by_user": {
          "terms": {
            "field": "comments.username",
            "size": 1
          },
          "aggs": {
            "by_nested": {
              "top_hits": {}
            }
          }
        }
      }
    }
  }
}

 

 

배열 필드의 첫 번째 슬롯에 있는 중첩된 히트가 있는 상위 히트 응답 스니펫 comments:

 
{
  ...
  "aggregations": {
    "by_sale": {
      "by_user": {
        "buckets": [
          {
            "key": "baddriver007",
            "doc_count": 1,
            "by_nested": {
              "hits": {
                "total" : {
                   "value": 1,
                   "relation": "eq"
                },
                "max_score": 0.3616575,
                "hits": [
                  {
                    "_index": "sales",
                    "_id": "1",
                    "_nested": {
                      "field": "comments",  
                      "offset": 0 
                    },
                    "_score": 0.3616575,
                    "_source": {
                      "comment": "This car could have better brakes", 
                      "username": "baddriver007"
                    }
                  }
                ]
              }
            }
          }
          ...
        ]
      }
    }
  }
}
 

 

  • 중첩된 히트를 포함하는 배열 필드의 이름
  • 포함 배열에 중첩된 히트가 있는 경우 위치
  • 중첩된 히트의 소스

 

요청이 있으면 _source문서의 전체 소스가 아닌 중첩된 개체의 소스 일부만 반환됩니다. 또한 중첩된 내부 개체 수준의 저장된 필드는 또는 집계 top_hits기에 있는 집계기를 통해 액세스할 수 있습니다 .nestedreverse_nested

중첩된 히트만 히트에 필드가 있고 _nested, 중첩되지 않은(일반) 히트에는 필드가 없습니다 _nested.

해당 정보는 활성화되어 있지 않으면 _nested다른 곳의 원본 소스를 구문 분석하는 데 사용될 수도 있습니다 _source.

매핑에 정의된 중첩된 객체 유형의 여러 수준이 있는 경우, _nested두 계층 이상 깊이의 중첩된 히트의 ID를 표현하기 위해 정보도 계층적일 수 있습니다.

아래 예에서 중첩된 히트는 필드의 첫 번째 슬롯에 있고, nested_grand_child_field그 슬롯은 필드의 두 번째 슬로우에 있습니다 nested_child_field.

 

...
"hits": {
 "total" : {
     "value": 2565,
     "relation": "eq"
 },
 "max_score": 1,
 "hits": [
   {
     "_index": "a",
     "_id": "1",
     "_score": 1,
     "_nested" : {
       "field" : "nested_child_field",
       "offset" : 1,
       "_nested" : {
         "field" : "nested_grand_child_field",
         "offset" : 0
       }
     }
     "_source": ...
   },
   ...
 ]
}
...

 

Use in pipeline aggregations

top_hits버킷당 단일 값을 사용하는 파이프라인 집계에서 사용할 수 있습니다. bucket_selector SQL에서 HAVING 절을 사용하는 것과 유사한 버킷당 필터링에 적용되는 것과 같습니다. 이를 위해서는 size1로 설정하고 래핑 집계기에 전달할 값에 대한 올바른 경로를 지정해야 합니다. 후자는 _source, a _sort또는 _scorevalue가 될 수 있습니다.

 

POST /sales/_search?size=0
{
  "aggs": {
    "top_tags": {
      "terms": {
        "field": "type",
        "size": 3
      },
      "aggs": {
        "top_sales_hits": {
          "top_hits": {
            "sort": [
              {
                "date": {
                  "order": "desc"
                }
              }
            ],
            "_source": {
              "includes": [ "date", "price" ]
            },
            "size": 1
          }
        },
        "having.top_salary": {
          "bucket_selector": {
            "buckets_path": {
              "tp": "top_sales_hits[_source.price]"
            },
            "script": "params.tp < 180"
          }
        }
      }
    }
  }
}

 

 

는 집계 값을 제공하는 필드, 즉 위의 예에서 field 에 대한 이름 과 키워드를 bucket_path사용합니다 . 다른 옵션으로는 위의 정렬 값을 필터링하는 , 와 상위 히트의 점수를 필터링하는 , 가 있습니다.top_hitstop_sales_hits_sourcepricetop_sales_hits[_sort]datetop_sales_hits[_score]

 

 

728x90
반응형

'ES8 > elasticsearch8' 카테고리의 다른 글

[es8] similarity Search  (0) 2024.08.04
[ES8] elasticsearch-head  (0) 2024.02.03
[ES8] ES|QL  (1) 2023.12.23