ES客户端spring-boot-starter-data-elasticsearch
ES客户端分类
Es-Server提供RESTFul-Api,客户端通过发起http请求,调用api实现索引库的管理,数据的交换,server端状态的监控......
- 官方java客户端:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.15.2</version>
</dependency>
- SpringDataElasticSearch:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
SpringDataElasticSearch继承了官方客户端elasticsearch-rest-client
- Elasticsearch.Net
- devtool:kibana
- HttpClient
- postman
- ......
特殊的客户端,节点客户端(NodeClient),将自己作为Es-server集群的节点。
SpringDataElasticsearch
- ElasticsearchRepository
- ElasticsearchRestTemplate
- ElasticsearchOperations
ElasticsearchRestTemplate继承了ElasticsearchOperations,一般开发中都是基于ElasticsearchRestTemplate来访问ES服务端。
ElasticsearchRestTemplate
环境
- ES-Server:7.14.0
- SpringBoot:2.5.3
- spring-boot-starter-data-elasticsearch:2.5.3
- Spring Data Elasticsearch: 4.2.3
- Elasticsearch Client used: 7.12.1
- Elasticsearch cluster: 7.14.0
- 测试索引库名称:vehicle
- 索引库数据结构:
{
"_index": "vehicle",
"_type": "_doc",
"_id": "19771755968",
"_version": 1,
"_score": 1.0,
"_source": {
"id": 19771755968,
"crossing_id": 30474,
"plate_number": "沪D86447",
"plate_color": "黄色",
"is_valid": 1,
"snap_time": "2021-08-29 08:00:00",
"create_time": "2021-08-29 08:07:51",
"lane_number": 1,
"crossing_timestamp": 1630195671.0
}
}
- 索引库映射:
{
"vehicle": {
"mappings": {
"properties": {
"create_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"crossing_id": {
"type": "keyword"
},
"crossing_timestamp": {
"type": "long"
},
"id": {
"type": "keyword"
},
"is_valid": {
"type": "keyword"
},
"lane_number": {
"type": "keyword"
},
"plate_color": {
"type": "keyword"
},
"plate_number": {
"type": "keyword"
},
"snap_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
}
引入pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.71</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
配置ES-Server地址
application.yml
spring:
elasticsearch:
rest:
uris: http://192.168.1.149:19200
定义model
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
import java.time.LocalDateTime;
@Accessors(chain = true)
@Data
@Document(indexName = "vehicle")
public class Vehicle implements Serializable {
@Id
private String id;
@Field("plate_number")
private String plateNumber;
@Field("plate_color")
private String plateColor;
@Field("is_valid")
private Integer valid;
@Field("lane_number")
private Integer laneNumber;
@Field(name = "create_time", type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@Field("crossing_id")
private Long crossingId;
@Field("crossing_timestamp")
private Long crossingTimestamp;
private Long sum;
}
根据id查询
@Autowiredprivate ElasticsearchRestTemplate template;
@GetMapping("/{id}")
public Vehicle getVehicle(@PathVariable("id") String id) {
Vehicle vehicle = template.get(id, Vehicle.class);
return vehicle;
}
list查询
@Autowiredprivate ElasticsearchRestTemplate template;
@PostMapping("/list")
public List<Vehicle> findVehicle(@RequestBody FindVehicleParam param) {
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("plate_number", param.getPlateNumber()))
.withQuery(null != param.getPlateColor() ? QueryBuilders.matchQuery("plate_color", param.getPlateColor()) : null)
.build();
SearchHits<Vehicle> result = template.search(query, Vehicle.class);
List<Vehicle> lists = result.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
return lists;
}
查询过滤
@Autowiredprivate ElasticsearchRestTemplate template;
@PostMapping("/filter")
public List<Vehicle> findVehicleWithFilter(@RequestBody FindVehicleParam param) {
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("plate_number", param.getPlateNumber()))
.withQuery(null != param.getPlateColor() ? QueryBuilders.matchQuery("plate_color", param.getPlateColor()) : null)
//crossing_id 大于 2000
.withFilter(QueryBuilders.rangeQuery("crossing_id").gt(2000))
.build();
SearchHits<Vehicle> result = template.search(query, Vehicle.class);
List<Vehicle> lists = result.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
return lists;
}
查询聚合
@Autowiredprivate ElasticsearchRestTemplate template;
@PostMapping("/agg")
public VehicleAggregationDto findVehicleWithAgg(@RequestBody FindVehicleParam param) {
VehicleAggregationDto vehicleAggregationDto = new VehicleAggregationDto();
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("plate_number", param.getPlateNumber()))
.withQuery(null != param.getPlateColor() ? QueryBuilders.matchQuery("plate_color", param.getPlateColor()) : null)
//crossing_id 大于 2000
.withFilter(QueryBuilders.rangeQuery("crossing_id").gt(2000))
.addAggregation(AggregationBuilders.sum("sumCrossingTimestamp").field("crossing_timestamp"))
.addAggregation(AggregationBuilders.sum("sumCreateTime").field("create_time"))
.withPageable(PageRequest.of(0, 50))
.build();
SearchHits<Vehicle> result = template.search(query, Vehicle.class);
List<Vehicle> lists = result.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
vehicleAggregationDto.setVehicles(lists);
Map<String, Object> agg = new ConcurrentHashMap<>();
result.getAggregations().getAsMap().forEach((key, value) -> {
agg.put(key, ((Sum) value).getValue());
});
vehicleAggregationDto.setAggregation(agg);
return vehicleAggregationDto;
}
分页
@Autowiredprivate ElasticsearchRestTemplate template;
@PostMapping("/page")
public List<Vehicle> findVehiclePage(@RequestBody FindVehiclePageParam param) {
NativeSearchQuery query = new NativeSearchQueryBuilder()
// .withQuery(QueryBuilders.matchAllQuery())
.withQuery(QueryBuilders.matchQuery("plate_number", param.getPlateNumber()))
.withPageable(PageRequest.of(0, param.getPageSize()))
.withSort(SortBuilders.fieldSort("id"))
.build();
SearchHits<Vehicle> result = template.search(query, Vehicle.class);
List<Vehicle> lists = result.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
return lists;
}
引用
- 官网:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.15/java-rest-low-usage-maven.html
- SpringDataElasticsearch官网:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients.rest
ES客户端spring-boot-starter-data-elasticsearch的更多相关文章
- 从零开始开发一个Spring Boot Starter
一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...
- spring -boot s-tarter 详解
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...
- 【spring boot】【elasticsearch】spring boot整合elasticsearch,启动报错Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8
spring boot整合elasticsearch, 启动报错: Caused by: java.lang.IllegalStateException: availableProcessors ], ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- Spring Boot Starter列表
转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...
- Spring Boot Starter 介绍
http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...
- 手把手教你定制标准Spring Boot starter,真的很清晰
写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...
- Spring Boot Starter自定义实现三步曲
实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...
- 最详细的自定义Spring Boot Starter开发教程
1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...
- Spring Boot Starter 开发指南
Spring Boot Starter是什么? 依赖管理是任何复杂项目的关键部分.以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少. Spring ...
随机推荐
- 带你探索CPU调度的奥秘
摘要:本文将会从最基础的调度算法说起,逐个分析各种主流调度算法的原理,带大家一起探索CPU调度的奥秘. 本文分享自华为云社区<探索CPU的调度原理>,作者:元闰子. 前言 软件工程师们总习 ...
- 云图说|图解DGC:基于华为智能数据湖解决方案的一体化数据治理平台
摘要:数据湖治理中心DGC,帮助企业快速构建从数据集成到数据服务的端到端智能数据系统,消除数据孤岛,统一数据标准,加快数据变现,实现数字化转型. 本文分享自华为云社区<[云图说]第232期 图解 ...
- 活动预告| 字节跳动基于DataLeap的DataOps最佳实践
DataOps概念从2014年首次被提出,不断演化和发展,在2018 年Gartner 的数据管理成熟度曲线中确定了 DataOps,标志着 DataOps 被业界接纳和认可.随着数字化转型的推进以及 ...
- Axure 安装使用 FontAwesome
Axure 安装使用 FontAwesome. 字体下载:https://www.bootcss.com/p/font-awesome/ 解压后,到 font 目录,双击 FontAwesome.ot ...
- 自媒体时代的贤内助——AI 视频云
视频,通常是一段由活动画面组成的传递信息的内容.在如今这个信息爆炸的时代,我们每天都要在浩瀚的内容海洋中寻找需求的信息.一个视频是否吸引人内容固然是最重要的,但是播放是否流畅,画质是否清晰的影响力也不 ...
- RabbitMQ--工作模式
单一模式 即单机不做集群 普通模式 即默认模式,对于消息队列载体,消息实体只存在某个节点中,每个节点仅有 相同的元数据,即队列的结构 当消息进入A节点的消息队列载体后,消费 者从B节点消费时,rabb ...
- CentOS7系统上安装升级Vim8
基本步骤 1.卸载旧版vim yum remove vim* -y 2. 到Vim官方Github仓库下载目前最新的Vim Release版本 git clone https://github.com ...
- 如何在CSDN上如何快速转载博客
复制粘贴应该是最显而易见的方法,但是不仅会有丢失内容,而且格式也会丢失.要想达到更好的效果,可以从html源码入手. 1.在chrome浏览器中打开要转载的文章,右键选择检查(or使用F12) 2.在 ...
- POJ 1236 Network of Schools (连通图 - Garbow 算法)
POJ 1236 Network of Schools 校园网:给定N所学校和网络,目标是分发软件其他学校都可收到,求①所需最少分发学校数:②若任选学校都能收到,最低新增边数. 思路:同一个强连通 ...
- POJ 2726、POJ3074 :数独(二进制DFS)
题目链接:https://ac.nowcoder.com/acm/contest/1014/B 题目描述 In the game of Sudoku, you are given a large 9 ...