让我们从一个具体的例子开始。我有一个包含以下字段的文档:
{
"template": {
"mappings": {
"template": {
"properties": {
"tid": {
"type": "long"
},
"folder_id": {
"type": "long"
},
"status": {
"type": "integer"
},
"major_num": {
"type": "integer"
}
}
}
}
}
}
我想按字段folder_id
聚合查询结果,并为除以folder_id
的每个组检索前N个文档的_source
详细信息。所以我写查询DSL,像这样:
GET /template/template/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"status": 1
}
}
]
}
},
"aggs": {
"folder": {
"terms": {
"field": "folder_id",
"size": 10
},
"aggs": {
"top_hit":{
"top_hits": {
"size": 5,
"_source": ["major_num"]
}
}
}
}
}
}
但是,现在提出了一个要求,即每个folder_id
的热门匹配文档必须在字段major_num
上多样化。对于每个folder_id
,在top_hits
集合下,子terms
集合检索的热门命中文档在字段major_num
上必须是唯一的,并且对于每个major_num
值,最多返回1个文档(位于顶部)匹配结果。
top_hits
聚合不能接受子聚合,那么我该如何解决这个问题?
答案 0 :(得分:1)
为什么不简单地在terms
字段上添加另一个major_num
聚合?
GET /template/template/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"status": 1
}
}
]
}
},
"aggs": {
"folder": {
"terms": {
"field": "folder_id",
"size": 10
},
"aggs": {
"majornum": {
"terms": {
"field": "major_num",
"size": 10
},
"aggs": {
"top_hit": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}