메트릭 top_hits애그리게이터는 가장 관련성 있는 문서를 집계하는 것을 추적합니다. 이 애그리게이터는 하위 애그리게이터로 사용되도록 의도되어 있으므로 버킷당 가장 일치하는 문서를 집계할 수 있습니다.
최상위 집계로는 권장하지 않고 collapse 파라미터를 사용하라..
Options
- from- 가져오려는 첫 번째 결과로부터의 오프셋입니다.
- size- 버킷당 반환할 상위 매칭 히트의 최대 수. 기본적으로 상위 3개 매칭 히트가 반환됩니다.
- sort- 상위 매칭 히트를 정렬하는 방법. 기본적으로 히트는 주요 쿼리의 점수에 따라 정렬됩니다.
Supported per hit features
top_hits 집계는 정기적인 검색 결과를 반환하므로 많은 히트당 기능을 지원할 수 있습니다.
- Highlighting
- Explain
- Named queries
- Search fields
- Source filtering
- Stored fields
- Script fields
- Doc value fields
- Include versions
- Include Sequence Numbers and Primary Terms
제약이 은근 많네
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" }
]
}
는 객체 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]