【发布时间】:2020-01-28 22:28:01
【问题描述】:
让我们从一个具体的例子开始。我有一个包含这些字段的文档:
{
"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,由terms 聚合下的子top_hits 聚合检索到的top hits 文档,在字段major_num 上必须是唯一的,并且对于每个major_num 值,最多返回子中的1 个文档top hits 聚合结果。
top_hits 聚合不能接受子聚合,那么我应该如何解决这个问题?
【问题讨论】:
标签: elasticsearch lucene search-engine elasticsearch-aggregation