depathange+ top_hits聚合(作为subggregation)使用Elasticsearch Java API客户端7.17.x

发布于 2025-02-12 07:57:58 字数 1839 浏览 1 评论 0原文

我已经过了一天了,我不太了解我是怎么做到的!这是我想使用新的Java API客户端“重新创建”的查询(使用Spring Boot),

{
  "aggs": {
    "range": {
      "date_range": {
        "field": "timestamp",
        "ranges": [
          { "to": "now-2d" } 
        ]
      }
    }
  ,
  "aggs": {
      "top_hits": {
        "_source": {
              "includes": [ "Id", "timestamp" ]
            }
      }
  }
}
}

我尝试使用daterangeaggregation.of ,但我似乎无法获得正确的结果或键入。这是我

SearchResponse<MyDto> response = client.search(b -> b
                .index("test-index")
                .size(0) 
                .aggregations("range",a->a.dateRange(DateRangeAggregation.of(d->d
                  .field("timestamp").ranges(r->r.to(t->t.expr("now-2d")))))),
                    .aggregations("hits", a -> a
                        .topHits(h->h.source(SourceConfig.of(c->c.filter(f->f.includes(Arrays.asList("Id", "timestamp"))))))),
                MyDto.class 
            );

也尝试删除subggregation和查询目前的方法,但是我似乎没有正确的轨道无法获得doc_count的数量。来自水桶。我有点不知道如何在此处使用depaterange()

编辑:我玩了一点,至少能够获得doc_count的数量,我不太确定这是否是这样做的好方法?

Aggregation agg = Aggregation.of(a -> a
            .dateRange(d->d.field("timestamp").ranges(r->r.to(FieldDateMath.of(v->v.expr("now-2d"))))));
        
SearchResponse<MyDto> response = client.search(b -> b
               .index("test-index")
               .size(0) 
               .aggregations("range", agg),
                MyDto.class 
            );

return response.aggregations().get("range").dateRange().buckets().array().get(0).docCount();

我还修复了上面的查询,它具有不必要的额外查询,从而打破了结果。

I've been at this for a day and I don't quite understand how I do it! This is the query I want to "recreate" with the new Java API Client (using Spring Boot)

{
  "aggs": {
    "range": {
      "date_range": {
        "field": "timestamp",
        "ranges": [
          { "to": "now-2d" } 
        ]
      }
    }
  ,
  "aggs": {
      "top_hits": {
        "_source": {
              "includes": [ "Id", "timestamp" ]
            }
      }
  }
}
}

I tried doing it with DateRangeAggregation.of but I can't seem to get the right results or type. Here's what I have

SearchResponse<MyDto> response = client.search(b -> b
                .index("test-index")
                .size(0) 
                .aggregations("range",a->a.dateRange(DateRangeAggregation.of(d->d
                  .field("timestamp").ranges(r->r.to(t->t.expr("now-2d")))))),
                    .aggregations("hits", a -> a
                        .topHits(h->h.source(SourceConfig.of(c->c.filter(f->f.includes(Arrays.asList("Id", "timestamp"))))))),
                MyDto.class 
            );

I've also tried removing the subaggregation and query for now, but I don't seem to be on the right track to even get the number of doc_count from the bucket. I kind of don't get how to work with the dateRange() here.

Edit: I played around a bit and was able to at least get the number of doc_count, I'm not very sure if this is a good way to do it though?

Aggregation agg = Aggregation.of(a -> a
            .dateRange(d->d.field("timestamp").ranges(r->r.to(FieldDateMath.of(v->v.expr("now-2d"))))));
        
SearchResponse<MyDto> response = client.search(b -> b
               .index("test-index")
               .size(0) 
               .aggregations("range", agg),
                MyDto.class 
            );

return response.aggregations().get("range").dateRange().buckets().array().get(0).docCount();

I also fixed the query above, it had an unnecessary extra query that broke the result.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少女七分熟 2025-02-19 07:57:58

我的思考过程是错误的。我想要一段时间以来汇总的文件,但我误解了,并认为Tophits会给我提供给我,但这不是它的工作方式!我做了一个单独的范围查询,实际上是查询了我需要的文档。

My thought process was wrong. I wanted the documents that were aggregated within this a time but I misunderstood and thought tophits would give them to me, but that's not how it works! I made a seperate range query that actually queries the documents I needed back instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文