Elasticsearch v1.3.0 top hit aggregation
- 1.2.2 가 릴리즈 된지 몇 주 안 지난것 같은데, 이틀 전에 1.3.0 이 릴리즈 되었다.
- 1.3.0 에
top hits aggregation
이 추가 되었다. - 간단히 설명하면 aggregated 된 bucket 들 별로,
sub aggregator
를 사용할 수 있다고 생각하면 된다.
e.g. tags 필드로 그룹화 하고, 각 그룹별로 최신의 active 문서만 가져오는 쿼리
(각 질문은 source 에서 title 필드만 가져옴)
{
"aggs": {
"terms": {
"top-tags": {
"field": "tags",
"size": 3
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"sort": [
{
"last_activity_date": {
"order": "desc"
}
}
],
"_source": {
"include": [
"title"
]
},
"size" : 1
}
}
}
}
}
}
아래와 같이 응답한다.
"aggregations": {
"top-tags": {
"buckets": [
{
"key": "windows-7",
"doc_count": 25365,
"top_tags_hits": {
"hits": {
"total": 25365,
"max_score": 1,
"hits": [
{
"_index": "stack",
"_type": "question",
"_id": "602679",
"_score": 1,
"_source": {
"title": "Windows port opening"
},
"sort": [
1370143231177
]
}
]
}
}
},
{ ... },
{ ... }
]
}
}
e.g. body 필드에 “elections” 가 포함된 문서를 domain 필드를 기준으로 그룹화하는 예제 (각 domain 별로 score 를 기준으로 정렬)
- domain 필드에
terms aggregator
를 정의해서 domain 로 그룹화한다. max aggregator
는terms aggregator
의 순서를 bucket 내에서 score 로 정렬하기 위한sub-aggregator
이다.
쿼리:
{
"query": {
"match": {
"body": "elections"
}
},
"aggs": {
"top-sites": {
"terms": {
"field": "domain",
"order": {
"top_hit": "desc"
}
},
"aggs": {
"top_tags_hits": {
"top_hits": {}
},
"top_hit" : {
"max": {
"script": "_doc.score"
}
}
}
}
}
}