首页 > 解决方案 > 如何在桶排序聚合期间在 Java Elasticsearch 客户端中指定 from 子句

问题描述

我正在尝试为桶排序聚合实现分页。我有这个工作查询:

GET /test/_search
{

  "query": {
    "bool": {
      "must": [
        { "match": { "code": 66 }}
      ]
    }
  },
    "aggs": {
      "group_by_user": {
        "terms": {
          "field": "userId.keyword"
        },
        "aggs": {
          "total_points": {
            "sum": {
              "field": "points"
            }
          },
          "test_bucket_sort": {
            "bucket_sort": {
              "sort": [
                {"total_points": {"order": "desc"}}
              ],
              "size": 3,
              "from": 1
            }
          }
        }
      }
    }
}

它正在工作并返回 3 个跳过第一个的聚合记录。现在我正在尝试使用 Java API 重现此查询。我跳过不相关的代码,只发布“aggs”部分:

       this.aggregationBuilder = AggregationBuilders
                .terms("group_by_user")
                .field("userId.keyword")
                .subAggregation(AggregationBuilders.sum("total_points").field("points"))
                .order(BucketOrder.aggregation("total_points", false))
                .size(5);

我找不到指定的方法from(1),任何人都知道它是否没有在 java API 中实现或者是否存在解决方法?

标签: javaelasticsearch

解决方案


这是一个好的开始,但是,您没有为bucket_sort管道聚合使用正确的代码。这是你应该做的:

   List sort = Arrays.asList(new FieldSortBuilder("total_points").order(SortOrder.DESC));
   BucketSortPipelineAggregationBuilder bucketSort = PipelineAggregatorBuilders.bucketSort("test_bucket_sort", sort).from(1).size(3);

   this.aggregationBuilder = AggregationBuilders
            .terms("group_by_user")
            .field("userId.keyword")
            .subAggregation(AggregationBuilders.sum("total_points").field("points"))
            .subAggregation(bucketSort)

推荐阅读