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. 基于lio-sam框架,教你如何进行回环检测及位姿计算

    摘要:本篇主要解析lio-sam框架下,是如何进行回环检测及位姿计算的. 本文分享自华为云社区<lio-sam框架:回环检测及位姿计算>,作者:月照银海似蛟龙 . 前言 图优化本身有成形的 ...

  2. 手把手教你如何配置DBeaver对接FusionInsigth MRS Spark2x

    摘要:dbeaver是免费和开源为开发人员和数据库管理员通用数据库工具.本文介绍如何配置dbeaver对接FusionInsigth MRS Spark2x. 本文分享自华为云社区<DBeave ...

  3. 电商流量分析怎么做?试试这款数据工具 DataLeap!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 作为成熟的电商模式,货架场景可以让商家以更低的门槛入驻,让消费者完成更高销量的购买和复购. 在这一场景下,运营人员 ...

  4. Intellij IDEA 集成 Docker 发布

    1. Docker开启远程访问,注意端口不要用默认的,防止被攻击 [root@localhost ~]# vi /usr/lib/systemd/system/docker.service 修改 # ...

  5. 基于BaseHTTPRequestHandler的HTTP服务器基础实现

    1. BaseHTTPRequestHandler介绍 BaseHTTPRequestHandler是Python中的一个基类,属于http.server模块,用于处理HTTP请求的基本功能.它提供了 ...

  6. xv6book阅读 chapter1

    xv6book主要研究了xv6如何实现它的类Unix接口,但是其思想和概念不仅仅适用于Unix.任何操作系统都必须将进程多路复用到底层硬件上,相互隔离进程,并提供受控制的进程间通信机制. 1 了解xv ...

  7. ME21N 采购订单批导

    1业务场景 事务代码:ME21N创建采购订单 可以通过BAPI_PO_CREATE1批量创建 2代码实现 1.抬头 2.行项目 3.增强 抬头增强字段放在BAPI_TE_MEPOHEADER结构中的C ...

  8. [SDR] GNU Radio 系列教程(十五)—— GNU Radio GFSK 模块

    目录 1 GFSK 背景知识 2 GNU Radio GFSK 模块参数详解 3 GNU Radio GFSK 模块简示例 4 本文视频教程 参考链接 教程列表 基础教程: 综合教程: 视频和博客 1 ...

  9. Codeforces Round #731 (Div. 3) A~G 解题记录

    比赛链接:Here 1547A. Shortest Path with Obstacle 3个点 \(A,B,F\) ,前提 \(F\) 点为不可经过点,问 \(A\to B\) 最短路径长度 A题没 ...

  10. longjmp 使 C++ RAII 失效

    C 语言的 longjmp 没有进行栈展开,而是直接跳转.从 longjmp 到 setjmp 之间的所有析构函数都没有调用,也就是 RAII 失效. #include <setjmp.h> ...