1

我想根据热门点击聚合中第一个元素所拥有的属性从术语聚合中订购存储桶。

我的最大努力查询看起来像这样(有语法错误):

{
    "aggregations": {
        "toBeOrdered": {
            "terms": {
                "field": "parent_uuid",
                "size": 1000000,
                "order": {
                    "topAnswer._source.id": "asc"
                }
            },
            "aggregations": {
                "topAnswer": {
                    "top_hits": {
                        "size": 1
                    }
                }
            }
        }
    }
}

有谁知道如何做到这一点?

例子:

{
  "a":1,
  "b":2,
  "id":4
}
{
  "a":1,
  "b":3,
  "id":1
}
{
  "a":2,
  "b":4,
  "id":3
}

按“a”分组并按“id”(desc)对存储桶排序并在“b”(desc)上排序最高命中将给出:

{2:{
  "a":2,
  "b":4,
  "id":3
},1:{
  "a":1,
  "b":3,
  "id":1
}}
4

1 回答 1

1

您可以使用以下查询来完成。这个想法是为每个parent_uuid存储桶显示具有最小值的第一个顶部命中,并根据最小值以及使用子聚合对存储桶id进行排序。parent_uuididmin

{
  "aggregations": {
    "toBeOrdered": {
      "terms": {
        "field": "parent_uuid",
        "size": 1000000,
        "order": {
          "topSort": "desc"
        }
      },
      "aggregations": {
        "topAnswer": {
          "top_hits": {
            "size": 1,
            "sort": {
              "b": "desc"
            }
          }
        },
        "topSort": {
          "max": {
            "field": "id"
          }
        }
      }
    }
  }
}

试一试并报告这是否适合您。

于 2015-10-24T03:46:36.747 回答