es分组查询多个字段
创始人
2024-04-15 04:14:06
0

最近在做业务监控日志的展示, 公司用的es存储日志 ,所以也顺道学习了一波用java 的 RestHighLevelClient 查询es

    (1)普通查询   

           sql : where  id = xxx  ->  es : termQuery("id" , "xxxx")

                    where  id =XXXX and  name = xxxx   -> es : 这里要用到  BoolQueryBuilder , 也就是要用连接多个查询条件 , 

                    boolQueryBuilder.must(QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("id ", xxx)).must(QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("name ", xxx)))

       (2) 聚合查询 es中用桶的概念去做聚合查询, 首先将一堆数据根据什么条件分成一个一个的桶 , 也就是sql中的 group By 。每个桶中又有什么操作 , 比如  count , sum ,等。

      sql : group  by  id ->  es  : AggregationBuilders.terms("idCount").field("id") , 先给你的桶起一个叫 idCount 的名字,以便于在后边获取数据的时候根据这个桶id 拿到自己的桶分组结果 ,filed(id") 就是按照id分组了。

     分享一个聚合查询最常用的操作: topHits ,比方说 ,我现在 sql 想这样查  ,  select  count(id) , name , age  from person  group by  age , 按照 age 分组之后 , 我还想知道 name等其他字段 , 这个时候你就可以用tophits , 

     桶内查询:TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("active_user_count").field(field).size(10000) .subAggregation(AggregationBuilders.topHits("time").fetchSource({“age” , "name"}, null).size(1) );

    最后的size(1) 就是最后分组里面 ,我就要一条数据, 当然你还可以根据其他条件进行桶内排序, 比方 ,找出 18岁的人中, 最小的前三位 , 这个时候 ,tophits 可以这个样写, 

TermsAggregationBuilder aggregationBuilder = // 桶名字叫 max_age , 按照age 分组 , 每个桶里面又按照出生日期倒序排列, 并且每个桶只取前三个值
AggregationBuilders.terms("max_age").field("age").size(10000).subAggregation(AggregationBuilders.topHits("time").fetchSource(new String[]{"age", "name" , "id" }, null).size(3).sort("borb_date", SortOrder.DESC));// 在 桶外, 我又想根据 年龄倒序排列 , 
MaxAggregationBuilder serverTime = AggregationBuilders.max("maxAge111111").field("age");
BucketOrder absTimeOrder = BucketOrder.aggregation("maxAge111111", true);
aggregationBuilder.order(absTimeOrder);
aggregationBuilder.subAggregation(serverTime);
sourceBuilder.aggregation(aggregationBuilder);

注意  maxAge111111 这个名字哦 ,大家在调试代码的时候 , 如果没有出结果 ,一定要把  SearchRequest 对象中的  source 拷贝出来运行一下哦,本质上java 代码还是在构建 查询语句的过程 ,所以你也可以先用kibana写es 查询,成功后再跟根据语句去写java代码。

还有一个需要注意的地方 ,分桶查询结果默认只返回十条, 所以如果你图省事儿, 直接设置10000 ,sourceBuilder.size(10000) , 但是当查询结果超过一万就没办法了 ,安全做法是用es 游标去循环取值。

 

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...