ES High Level REST Client API 查询 聚合

  • 1 准备数据
    • 1.1 插入测试数据
  • 2 Maven引入ES
  • 3 创建Client
  • 4 查询API
    • 4.1 根据id查询单条数据
    • 4.2 根据多个id查询
    • 4.3 根据条件分页查询
    • 4.4 count
    • 4.5 max
  • 5 terms聚合
    • 5.1 根据1个字段group by
    • 5.2 根据多个字段group by

关于聚合的博客:
Elasticsearch教程(3) ES聚合查询DSL

Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组

Elasticsearch教程(5) 指标聚合 SQL DSL JavaAPI

Elasticsearch教程(6) 桶聚合Query DSL-Terms Aggregation

Elasticsearch教程(10) ES term terms prefix 搜索 聚合查询 详细总结

Elasticsearch教程(11) elasticsearch 桶聚合 Query DSL

Elasticsearch教程(32) ES 聚合查询后过滤 Distinct Group By Having功能

1 准备数据

首先启动好的ES6.8服务和Kibana服务

1.1 插入测试数据

假设有个部门组织的场景,部门有上级部门或者下级部门,像一颗树那样

字段 注释
code 部门编号
name 部门名称
level 层级
path 从祖先到自己的id路径
parentId 父部门Id (这里没有id字段,因为es自带_id这个字段了)
status 状态
PUT /dept/_doc/1
{"code": "dept_1","name": "部门1","level": 1,"path": "1","parentId": "","status":1
}PUT /dept/_doc/2
{"code": "dept_2","name": "部门2","level": 1,"path": "2","parentId": "","status":0
}PUT /dept/_doc/3
{"code": "dept_1_1","name": "部门1_1","level": 2,"path": "1,3","parentId": "1","status":0
}PUT /dept/_doc/4
{"code": "dept_1_2","name": "部门1_2","level": 2,"path": "1,4","parentId": "1","status":0
}PUT /dept/_doc/5
{"code": "dept_1_1_1","name": "部门1_1_1","level": 3,"path": "1,3,5","parentId": "3","status":1
}PUT /dept/_doc/6
{"code": "dept_1_1_2","name": "部门1_1_2","level": 3,"path": "1,3,6","parentId": "3","status":null
}

数据结果如下:

2 Maven引入ES

新建一个空的Maven结构项目,在pom.xml里添加如下

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>6.8.4</version>
</dependency>

3 创建Client

public class EsRestUtils {private static RestHighLevelClient client;private static final String type = "_doc";public static RestHighLevelClient getClient() {if (client == null) {client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.8.201", 9200, "http")));}return client;}
}

4 查询API

4.1 根据id查询单条数据

用SQL描述就是

select * from dept where id = '1'
protected static Map<String, Object> getById(String index, String id) throws IOException {getClient();GetRequest getRequest = new GetRequest(index, type, id);GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);if (getResponse.isExists()){return getResponse.getSourceAsMap();}return null;
}

4.2 根据多个id查询

用SQL描述就是

select * from dept where id in ("1", "2", "3")
protected static List<Map<String, Object>> getByIds(String index, List<String> ids) throws IOException {getClient();List<Map<String, Object>> results = new ArrayList<>();MultiGetRequest request = new MultiGetRequest();ids.stream().forEach(id -> {request.add(new MultiGetRequest.Item(index, type, id));});MultiGetResponse response = client.mget(request, RequestOptions.DEFAULT);GetResponse getResponse;for (int i = 0; i < response.getResponses().length; i++) {getResponse = response.getResponses()[i].getResponse();if (getResponse.isExists()) {results.add(getResponse.getSourceAsMap());}}return results;
}

4.3 根据条件分页查询

用SQL描述就是

select * from dept where id in ("1", "2", "3") limt 2,10
protected static List<Map<String, Object>> getByWhere(String index, QueryBuilder queryBuilder, int pageNo, int pageSize) throws IOException {getClient();List<Map<String, Object>> results = new ArrayList<>();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.from(pageNo);searchSourceBuilder.size(pageSize);SearchRequest searchRequest = new SearchRequest(index).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {results.add(hit.getSourceAsMap());}return results;
}

4.4 count

用SQL描述就是

select count(1) from dept where name like '部门%'
public static long count(QueryBuilder queryBuilder, String... indexs) throws IOException {getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);CountRequest countRequest = new CountRequest(indexs);countRequest.source(searchSourceBuilder);CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);long count = countResponse.getCount();return count;
}

4.5 max

用SQL描述就是

select max(level) from dept where name like '部门%'
public static Double getMax(QueryBuilder queryBuilder, String field, String... indexs) throws IOException {getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.size(0);AggregationBuilder aggregationBuilder = AggregationBuilders.max("agg").field(field);searchSourceBuilder.aggregation(aggregationBuilder);SearchRequest searchRequest = new SearchRequest(indexs).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Max agg = searchResponse.getAggregations().get("agg");return agg.getValue();
}

5 terms聚合

5.1 根据1个字段group by

用SQL描述就是

select level, count(id) from dept where name like '部门%' group by level
public static Map<String, Long> getTermsAgg(QueryBuilder queryBuilder, String field, String... Map<String, Long> groupMap = new HashMap<>();getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.size(0);AggregationBuilder aggregationBuilder = AggregationBuilders.terms("agg").field(field);searchSourceBuilder.aggregation(aggregationBuilder);SearchRequest searchRequest = new SearchRequest(indexs).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms terms = searchResponse.getAggregations().get("agg");for (Terms.Bucket entry : terms.getBuckets()) {groupMap.put(entry.getKey().toString(), entry.getDocCount());}return groupMap;
}

写代码测试

protected static void testGetTermsAgg(String index) {QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name.keyword", "部门*");try {Map<String, Long> groupMap = EsRestUtils.getTermsAgg(queryBuilder, "level", index);groupMap.forEach((key, value) -> System.out.println(key + " -> " + value.toString()));} catch (IOException e) {e.printStackTrace();}
}

运行结果如下,左边是level,右边是个数

1 -> 2
2 -> 2
3 -> 2

5.2 根据多个字段group by

用SQL描述就是

select level, status, count(id) from dept where name like '部门%' group by level, status
public static Map<String, Map<String, Long>> getTermsAggTwoLevel(QueryBuilder queryBuilder, String field1, String field2, String... indexs) throws IOException {Map<String, Map<String, Long>> groupMap = new HashMap<>();getClient();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);searchSourceBuilder.size(0);AggregationBuilder agg1 = AggregationBuilders.terms("agg1").field(field1);AggregationBuilder agg2 = AggregationBuilders.terms("agg2").field(field2);agg1.subAggregation(agg2);searchSourceBuilder.aggregation(agg1);SearchRequest searchRequest = new SearchRequest(indexs).types(type);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);Terms terms1 = searchResponse.getAggregations().get("agg1");Terms terms2;for (Terms.Bucket bucket1 : terms1.getBuckets()) {terms2 = bucket1.getAggregations().get("agg2");Map<String, Long> map2 = new HashMap<>();for (Terms.Bucket bucket2 : terms2.getBuckets()) {map2.put(bucket2.getKey().toString(), bucket2.getDocCount());}groupMap.put(bucket1.getKey().toString(), map2);}return groupMap;
}

写代码测试

protected static void testGetTermsAgg2(String index) {QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name.keyword", "部门*");try {Map<String, Map<String, Long>> groupMap = EsRestUtils.getTermsAggTwoLevel(queryBuilder, "level", "status", index);groupMap.forEach((key, value) -> System.out.println(key + " -> " + value.toString()));} catch (IOException e) {e.printStackTrace();}
}

对于id=6的那条数据,status=null,就不会统计到,如果没有status也不会统计到。

1 -> {0=1, 1=1}#leve=1的数据中,status=1的1条,status=0的1条
2 -> {0=2}     #leve=2的数据中,status=0的2条
3 -> {1=1}     #leve=3的数据中,status=1的1条

如果本文对您有帮助,就点个赞

Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组相关推荐

  1. java抛出异常齁_解決 Elasticsearch 使用 Java High Level REST Client 時出現 NoClassDefFoundError 錯誤...

    因為工作關係需要用到 Elasticsearch,評估過後決定使用 high-level REST client 來進行開發,但在環境建置上卻出現了一些問題 錯誤訊息如下: org.springfra ...

  2. Elasticsearch java api操作(一)(Java Low Level Rest Client)

    一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...

  3. java bulk_Elasticsearch Java High Level REST Client(Bulk API)

    Bulk API Java High Level REST Client提供了Bulk处理器来帮助处理批量请求. Bulk请求 BulkRequest可以使用一个请求执行多个索引.更新和/或删除操作. ...

  4. ElasticSearch 使用 High Level REST Client 实现搜索等功能实战

    点击关注公众号,实用技术文章及时了解 ES 全称 Elasticsearch 是一款分布式的全文搜索引擎,在互联网公司中,这款搜索引擎一直被程序员们所推崇.常见的使用场景如ELK日志分析,电商APP的 ...

  5. ElasticSearch Java High level Rest Client 官方文档中文翻译(一)

    ElasticSearch Java High level Rest Client 官方文档中文翻译 一 纯粹记录自己在看官网的es rest high level api 时的翻译笔记,可以对照着官 ...

  6. Java High Level REST Client 中文API(仅供参考)

    1.初始化 兼容性 Java High Level REST Client需要Java 1.8,并依赖于Elasticsearch核心项目,客户端版本与客户端开发的Elasticsearch版本相同, ...

  7. Elasticsearch Java Low Level REST Client(通用配置)

    Elasticsearch Java Low Level REST Client(通用配置) 通用配置 正如初始化中所解释的,RestClientBuilder支持提供RequestConfigCal ...

  8. 十分nb且详细的Elasticsearch教程

    实时搜索引擎Elasticsearch Elasticsearch(简称ES)是一个基于Apache Lucene™的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能 ...

  9. 没有比这个更详细的Elasticsearch教程

    Elasticsearch Elasticsearch简介与安装 什么是Elasticsearch? ​ ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全 ...

最新文章

  1. 央视曝光:股市暴跌暴涨,投资的安全感在哪里?
  2. 使用wide和buildbox构建完全在线的开发集成环境
  3. windows 64位 dll文件 位置及python包rtree shapely安装
  4. ajax 请求超过了5s 还没有返回 的话 就自动取消
  5. 在网页中JS函数自动执行常用三种方法
  6. 【Java设计模式】装饰模式
  7. Vue2.0 $set()的正确使用方式
  8. C++多线程实现电子词典
  9. LSTM 和 GRU
  10. c#中通过win32API(FindWindowEx)查找控件句柄实例
  11. GC 调优(实战篇) - GC参考手册
  12. LiveCDLiveUSB制作
  13. Rust 入坑指南 | CSDN 博文精选
  14. 大数据审计的发展_关于发展大数据审计的几点思考
  15. [笔记分享] [SD] 块设备驱动学习小结
  16. 腾讯邱跃鹏:解密腾讯亿级产品背后网络架构故事
  17. 紫光视频平台服务器系统,紫光展锐打造操作系统生态,赋能万物互联智能时代...
  18. 网友心中的高分电影合集,大家一起来拯救剧荒!欢迎补充!!!
  19. 前端关系图谱插件_js前端使用jOrgChart插件实现组织架构图的展示
  20. 数据的聚合与分组运算

热门文章

  1. rs232读取智能电表_智能电表防窃电原理 偷电为什么会被发现
  2. ndk开发(二)JNI、java互调
  3. SVN提交错误:系统找不到指定路径
  4. java 蓝桥杯 奇怪的数列
  5. DayDayUp:上海地铁线路高清图、1~17号地铁线路各站点名称及对应路线集合之详细攻略
  6. JAVA帮助文档全系列
  7. 计算机与文秘专业有哪些课程,文秘专业开设的课程有哪些
  8. STM32F103+RFID-RC522模块 实现简单读卡写卡demo
  9. 店盈通: 拼多多店运营怎么选择推广关键词?
  10. MyBatis---缓存-提高检索效率的利器