es进阶语法查询
admin
2024-03-21 14:53:44
0

在看这篇前,先看下es基础语法,比较容易上手。

针对于最近做的车机平台系统一些常用的写法,做了一些记录。

数据格式如下:

{"took": 16,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "vehicle_vip_data_202209","_type": "_doc","_id": "UZo9eIMBUZW80fpzWLp9","_score": 1.0,"_source": {"user_id": "1","vehicle_id": "2c","app_id": "12","os_ver": "ES6_kylo_BL1.0.1_101.6_20220720","tracking_type": "perf_vip_stat","timestamp": 1663149893,"datetime": "2022091418","day": "20220914","track_data": [{"key": "com.nio.carsystemui","cpu": 0.21635656,"mem": 202447.0}, {"key": "com.android.car","cpu": 0.2805656,"mem": 25879.0}]}}]}
}

1.查询某些字段列表下拉框

group_ver是自定义的名称,os_ver就是数据中的字段,根据这个字段分组得到你想要去重(分组)的list

@Override
public SearchRequest buildRequest() {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();SearchRequest searchRequest = new SearchRequest();searchSourceBuilder.size(0);TermsAggregationBuilder verTerms = AggregationBuilders.terms("group_ver").field("os_ver").size(10000).order(BucketOrder.key(true));searchSourceBuilder.aggregation(verTerms);// 查询的索引//目前索引写死,后期与当前时间相关动态调整searchRequest.indices("vehicle_system_data_202209");searchRequest.source(searchSourceBuilder);return searchRequest;
}

2.精确条件查询

查询day的时间范围

精确查询vehicle_id和os_ver

@Override
public SearchRequest buildRequest(AppMemDataQueryDTO appMemDataQueryDTO) {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();SearchRequest searchRequest = new SearchRequest();QueryBuilder daytime = QueryBuilders.rangeQuery("day").gte(appMemDataQueryDTO.getStartDay()).lte(appMemDataQueryDTO.getEndDay());BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(daytime);if(StringUtils.isNotBlank(appMemDataQueryDTO.getVehicleId())) {boolQueryBuilder.must(QueryBuilders.termQuery("vehicle_id",appMemDataQueryDTO.getVehicleId()));}if(StringUtils.isNotBlank(appMemDataQueryDTO.getOsVer())) {boolQueryBuilder.must(QueryBuilders.termQuery("os_ver", appMemDataQueryDTO.getOsVer()));}//最多展示10条searchSourceBuilder.size(10);searchSourceBuilder.query(boolQueryBuilder);// 查询的索引//目前索引写死,后期与当前时间相关动态调整searchRequest.indices("vehicle_vip_data_202209");searchRequest.source(searchSourceBuilder);return searchRequest;
}

3.聚合查询

时间范围

os_ver分组

求count,求平均数,求中位数

track_data.mem是一条数据中的子对象的属性

@Override
public SearchRequest buildMemRequest(MemDataQueryDTO memDataQueryDTO){SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();SearchRequest searchRequest = new SearchRequest();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery("day").from(memDataQueryDTO.getStartDay()).to(memDataQueryDTO.getEndDay()).format("yyMMdd"));searchSourceBuilder.size(0);searchSourceBuilder.query(boolQueryBuilder);// 查询的索引//目前索引写死,后期与当前时间相关动态调整searchRequest.indices("vehicle_system_data_202209");//分组TermsAggregationBuilder verTerms = AggregationBuilders.terms("ver_terms").field("os_ver").size(10000);//求countValueCountAggregationBuilder memCount = AggregationBuilders.count("mem_count").field("track_data.mem");//平均数AggregationBuilder memAvg = AggregationBuilders.avg("avg_cpu").field("track_data.mem");//中位数AggregationBuilder pointRanks = AggregationBuilders.percentiles("ranks").field("track.perf_system_mem").percentiles(25,50,75,90);searchSourceBuilder.aggregation(verTerms.subAggregation(pointRanks).subAggregation(memCount).subAggregation(memAvg));searchRequest.source(searchSourceBuilder);return searchRequest;
}

4.聚合查询(nested嵌套分组)

和第3条很像,具体参考nested和object区别

区别就是用nested就会把子对象的属性都会join关联上。默认子对象是不会关联,但是效率就会更差点

当你需要对一条数据的子对象分组并做聚合参数时,需要使用到es的nested特性

@Override
public SearchRequest buildCpuRequest(AppCpuDataQueryDTO query) {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();SearchRequest searchRequest = new SearchRequest();QueryBuilder daytime = QueryBuilders.rangeQuery("day").gte(query.getStartDay()).lte(query.getEndDay());BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(daytime);searchSourceBuilder.size(0);searchSourceBuilder.query(boolQueryBuilder);// 查询的索引//目前索引写死,后期与当前时间相关动态调整searchRequest.indices("vehicle_vip_data_202209");//分组TermsAggregationBuilder verTerms = AggregationBuilders.terms("ver_terms").field("os_ver").size(10000);//申明一个nested对象,名字自定义,属性是子对象名称track_dataNestedAggregationBuilder trackNested = AggregationBuilders.nested("track_data_nested", "track_data");TermsAggregationBuilder trackKey = AggregationBuilders.terms("data_key").field("track_data.key").size(10000);//根据子对象的filter条件精确查询(条件优化)FilterAggregationBuilder filterKey = AggregationBuilders.filter("nested_key",QueryBuilders.termQuery("track_data.key",query.getAppName()));//平均数AggregationBuilder cpuAvg = AggregationBuilders.avg("avg_cpu").field("track_data.cpu");//countValueCountAggregationBuilder memCount = AggregationBuilders.count("count").field("track_data.cpu");AggregationBuilder pointRanks = AggregationBuilders.percentiles("ranks").field("track_data.cpu").percentiles(25,50,75,90);searchSourceBuilder.aggregation(verTerms.subAggregation(trackNested.subAggregation(filterKey.subAggregation(trackKey.subAggregation(memCount).subAggregation(pointRanks).subAggregation(cpuAvg)))));searchRequest.source(searchSourceBuilder);return searchRequest;
}

4.聚合查询(nested嵌套分组)

和第3条很像,具体参考nested和object区别

区别就是用nested就会把子对象的属性都会join关联上。默认子对象是不会关联,但是效率就会更差点

当你需要对一条数据的子对象分组并做聚合参数时,需要使用到es的nested特性

@Override
public SearchRequest buildCpuRequest(AppCpuDataQueryDTO query) {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();SearchRequest searchRequest = new SearchRequest();QueryBuilder daytime = QueryBuilders.rangeQuery("day").gte(query.getStartDay()).lte(query.getEndDay());BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().filter(daytime);searchSourceBuilder.size(0);searchSourceBuilder.query(boolQueryBuilder);// 查询的索引//目前索引写死,后期与当前时间相关动态调整searchRequest.indices("vehicle_vip_data_202209");//分组TermsAggregationBuilder verTerms = AggregationBuilders.terms("ver_terms").field("os_ver").size(10000);//申明一个nested对象,名字自定义,属性是子对象名称track_dataNestedAggregationBuilder trackNested = AggregationBuilders.nested("track_data_nested", "track_data");TermsAggregationBuilder trackKey = AggregationBuilders.terms("data_key").field("track_data.key").size(10000);//根据子对象的filter条件精确查询(条件优化)FilterAggregationBuilder filterKey = AggregationBuilders.filter("nested_key",QueryBuilders.termQuery("track_data.key",query.getAppName()));//平均数AggregationBuilder cpuAvg = AggregationBuilders.avg("avg_cpu").field("track_data.cpu");//countValueCountAggregationBuilder memCount = AggregationBuilders.count("count").field("track_data.cpu");AggregationBuilder pointRanks = AggregationBuilders.percentiles("ranks").field("track_data.cpu").percentiles(25,50,75,90);searchSourceBuilder.aggregation(verTerms.subAggregation(trackNested.subAggregation(filterKey.subAggregation(trackKey.subAggregation(memCount).subAggregation(pointRanks).subAggregation(cpuAvg)))));searchRequest.source(searchSourceBuilder);return searchRequest;
}

相关内容

热门资讯

商业航天前景广阔,通用航空ET... 截至2月26日13点30分,上证指数涨0.04%,深证成指涨0.30%,创业板指跌0.22%。ETF...
百惠金控:港股IPO供需两旺 ... 开年以来,香港IPO市场表现持续活跃,目前有超过400家公司正在冲刺上市。其中,根据第18A、18C...
狠拼资管!保险资管“吸金榜”:... 2026年开年,保险资管产品交出了一份亮眼的成绩单。 Wind数据显示,截至2月24日,今年以来已披...
公募新发基金集中备战 千亿增量... 数据来源:Wind 余世鹏/制表 证券时报记者 余世鹏 随着马年开年行情徐徐展开,公募资...
原创 美... 邱 林 两个月过去了,任凭英伟达公司达创始人黄仁勋多方奔走、积极游说,英伟达对华H200芯片的销售似...
小米起诉自媒体账号实控人为李斌... 中新网北京2月26日电(胡淑娟 查志远)据小米法务部微博24日发布信息,自媒体账号“AutoRepo...
原创 俄... 编辑:[太阳] 2026年,俄煤生意越挖越亏。煤价跌、卢布强、物流贵,俄煤直接成了赔钱货。中国占出口...
金价上涨,银价大涨!原因找到了... 美国白宫酝酿出台15%的全球关税税率,引发投资者避险情绪升温,加之美元指数下跌,国际金价周三上涨,重...
矿机设备涨价、比特币跳水:美国... 上周五(2月20日),美国最高法院以6:3的表决结果裁定,特朗普政府去年援引《国际紧急经济权力法》(...
AI硬件产业链股走强,人工智能... 2月26日早盘,CPO、铜缆、液冷服务器、PCB等AI硬件股集体走强。截至午间收盘,中证科创创业人工...
原创 死... 前言大家好,我是小邹!这些天,全球的目光都紧紧锁定在了白宫。特朗普发起的全球关税大棒,可谓是挥舞得虎...
原创 美... 2026年2月20日,最高法院给出了一项直接且明确的判决,以6比3的票数推翻了总统使用《国际紧急经济...
拉普拉斯发生大宗交易 成交溢价... 拉普拉斯2月25日大宗交易平台出现一笔成交,成交量7.20万股,成交金额603.36万元,大宗交易成...
三只羊借壳上市成功?公司回应 【大河财立方消息】2月26日,三只羊(合肥)控股集团有限公司发布声明称,近日,网络上大量传播关于“三...
甘露饮:顽固性口疮的专方妙治 导读:今天学习掌握阴虚兼湿热型口疮的辨证思路,专方应用及巩固调理方法。 治病容易“养心”难 (口疮反...
李亚鹏旗下嫣然医院成立电商公司 企查查APP显示,近日,北京嫣然益笑电子商贸有限公司成立,法定代表人为陈协利,注册资本500万元,经...
太子集团陈志约12.7万枚比特... 每经编辑|何小桃 2026年2月26日,国家计算机病毒应急处理中心微信公众号发布《“头号玩家”——...
减持字节暴赚!估值从200亿美... 2月26日消息,据“路透社”援引两位知情人士的消息报道,知名投资公司泛大西洋投资集团(General...
和讯特稿李景峰:“AI灭霸”对... 近期市场持续讨论AI是否会对某些行业构成实质性冲击,被称为AI灭霸的Anthropic Claude...
Anthropic收购PC智能... IT之家 2 月 26 日消息,Anthropic 当地时间 25 日宣布收购 PC 智能体应用领域...