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;
}

引用

ES客户端spring-boot-starter-data-elasticsearch的更多相关文章

  1. 从零开始开发一个Spring Boot Starter

    一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...

  2. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  3. 【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 ], ...

  4. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  5. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  6. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  7. 手把手教你定制标准Spring Boot starter,真的很清晰

    写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...

  8. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

  9. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

  10. Spring Boot Starter 开发指南

    Spring Boot Starter是什么? 依赖管理是任何复杂项目的关键部分.以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少. Spring ...

随机推荐

  1. 斗罗大陆真3D手游实力上线,带你感受魂兽猎杀的超燃时刻

    摘要:在华为云数据库支撑该游戏的仅两个月内就完成了游戏内测至上线的全流程,业务上线流程缩短50%,并支撑海量游戏用户同时在线,达到了200万的用户预约量,上线首日流水破1000万. "没有废 ...

  2. 跟着字节AB工具DataTester,5步开启一个实验

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   火山引擎A/B测试平台DataTester孵化于字节跳动业务内部,在字节跳动,"万事皆A/B,一切可 ...

  3. Markdown Emojio 表情图标

     :smile:  :laughing:  :blush:  :smiley: ️ :relaxed:  :smirk:  :heart_eyes:  :kissing_heart:  :kissin ...

  4. 【邀请有礼】全球视频云创新挑战赛邀请有礼:参与 100% 获得 “壕” 礼,更有机会获得 JBL 音箱、Cherry 机械键盘

    活动背景: 2021 年首届全球视频云创新挑战赛报名火热进行中,这里奖金池高达四十万,有业界顶尖专家指导,有展示自我技能的广阔舞台,还有入职阿里的绿色招聘通道.如果你有一点点心动,那请不要错过这场挑战 ...

  5. js import的几种用法

    最近昨天公司小朋友离职,临时接收其负责的vue前端项目.vue好久没做了,很多东西都忘记或以前也没接触,几天开始慢慢写点vue的小知识,算是历程或备忘吧. import在js.ts中用了不知多少次,但 ...

  6. 【3rd_Party】format() 处理一些常见的格式化解决方案

    fmt的痛与对format设计的思考 fmt:轻量高性能的C++格式化库 C++20 引入了新的 format() 函数,该函数以字符串形式返回参数的格式化表示.format() 使用 python ...

  7. 关于 Jupyter 导出 PDF/Latex 格式报错的简单解决方法

    利用 Jupyter 提供的 Print Preview 功能,然后鼠标右键点击打印,就能导出PDF了,而且不会出问题,中文,图片都可以

  8. nvm:npm的包管理器

    NVM: npm的包管理器 其实许久前就像写这个模块了,只是之前使用后又搁置了,今天下项目时node版本不一致,才想起记录 nvm下载地址: Releases · coreybutler/nvm-wi ...

  9. SpringBoot Serverless 实战 | 监控调试

    SpringBoot 是基于 Java Spring 框架的套件,它预装了 Spring 的一系列组件,让开发者只需要很少的配置就可以创建独立运行的应用程序.在云原生的世界,有大量的平台可以运行 Sp ...

  10. mybatis-plus-QueryWrapper 如何写or效果的语句 以及如何给or加括号

    先说想要的结果 希望mybatis-plus中QueryWrapper写法生成的sql语句中查询条件是 WHERE (( (LOGIN_ID = ? OR SHI_JI_LOGIN_ID = ?) ) ...