【问题标题】:How to diversify the result of top-hits aggregation?如何使热门聚合结果多样化?
【发布时间】: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


    【解决方案1】:

    为什么不简单地在 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
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 这将只返回两个相同级别的聚合结果,一个用于major_num 术语,一个用于top_hits 结果,但是,top_hits 结果文档对于该字段不是“唯一的” major_num,但这就是我想要的。
    • 我想要的是,比如在同一个folder_id下,获取major_num == 1的1个文档,major_num == 2的1个文档,以此类推……
    • 这正是您将得到的,因为每个 major_num 都会有自己的存储桶。你试过了吗?
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多