黑色卷纸 2019-07-11 14:45 采纳率: 0%
浏览 896

如何通过ES取出若干数据中时间最大的数据?

es难题。ES经过条件搜索后同一事件有多种状态,以最后一次状态为准,但是怎么取出这些数据呢?
例如:经过条件筛选后查出如下数据

 编号       数据         时间            状态
  1          a         20190711            0
  2          a         20190712            2
  3          a         20190713            1
  4          b         20190711            0
  5          b         20190712            3
  6          b         20190714            2

最后应该取出的数据是

  3          a         20190713            1
  6          b         20190714            2

因为这两条的数据状态是最新的。
可用java语言或表达式回答。

  • 写回答

1条回答 默认 最新

  • 明初啥都能学会 2024-04-24 14:55
    关注

    该回答引用ChatGPT3.5,结果代码方法已验证可行
    你可以通过使用Elasticsearch的聚合功能来实现这个需求。具体来说,你可以使用terms聚合来按数据字段(这里是"数据"字段)分组,并使用最大值聚合来找到每个分组中时间最大的数据。

    以下是一个使用Java API来实现的示例代码:

    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms;
    import org.elasticsearch.search.aggregations.metrics.max.Max;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.elasticsearch.search.sort.SortBuilders;
    import org.elasticsearch.search.sort.SortOrder;
    
    import java.io.IOException;
    
    public class ElasticsearchQuery {
        public static void main(String[] args) throws IOException {
            // 在此处初始化 Elasticsearch 客户端
    
            // 创建搜索请求
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.matchAllQuery());
            sourceBuilder.aggregation(
                    AggregationBuilders.terms("by_data").field("数据.keyword")
                            .subAggregation(AggregationBuilders.max("max_time").field("时间"))
            );
            sourceBuilder.sort(SortBuilders.fieldSort("时间").order(SortOrder.DESC)); // 按时间降序排序
    
            // 执行搜索请求
            SearchResponse response = client.search(sourceBuilder);
    
            // 处理搜索结果
            Terms byData = response.getAggregations().get("by_data");
            for (Terms.Bucket bucket : byData.getBuckets()) {
                Max maxTime = bucket.getAggregations().get("max_time");
                String data = bucket.getKeyAsString();
                long maxTimestamp = (long) maxTime.getValue();
                System.out.println("数据:" + data + ", 时间:" + maxTimestamp);
            }
        }
    }
    

    这段代码执行以下操作:

    1. 创建一个搜索请求,该请求会对所有文档进行匹配,并对"数据"字段进行分组,然后在每个分组中找到"时间"字段的最大值。
    2. 执行搜索请求,并处理返回的结果。对于每个分组,输出分组键(即数据),以及时间的最大值。

    这样就可以得到每个数据字段中时间最大的数据了。

    评论

报告相同问题?