如何使top-hits聚合的结果多样化?

How to diversify the result of top-hits aggregation?

让我们从一个具体的例子开始。我有一个包含这些字段的文档:

{
  "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_idterms 聚合下的子 top_hits 聚合检索的热门文档,在字段 major_num 上必须是唯一的,并且对于每个 major_num value, return sub top hits聚合结果中最多1个文档。

top_hits聚合不能接受子聚合,请问如何解决?

为什么不简单地在 major_num 字段上添加另一个 terms 聚合?

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
              }
            }
          }
        }
      }
    }
  }
}