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. Python pdf 转 图片

    安装依赖 D:\OpenSource\Python>pip install pdf2image pillow -i https://pypi.tuna.tsinghua.edu.cn/simpl ...

  2. Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了

    如何阻止 Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了 使用 CountDownLatch CountDownLatch.CyclicBarrier 使用区别 多线 ...

  3. SocketChannel支持设定参数

    SocketChannel支持设定参数SO_SNDBUF 套接字发送缓冲区大小SO_RCVBUF 套接字接收缓冲区大小SO_KEEPALIVE 保护连接O_REUSEADDR 复用地址SO_LINGE ...

  4. NOKOV度量动作捕捉协助完成无人机室内定位研究

    随着工业发展.技术进步,无人机的使用在各行各业愈发普遍,开始出现无人机飞行送外卖.智能无人机自主巡检等多方面应用.在这一过程中,无人机飞行定位就成为了重中之重. 西北工业大学无人机特种技术国防科技重点 ...

  5. 这应该是java最好用的orm之一了

    这应该是java最好用的orm之一了 说起orm大家肯定都不会陌生,作者是一个.net菜鸟.并且是在.net繁荣的orm圈子下成长的,所以这次给大家带来的是媲美efcore,freesql,sqlsu ...

  6. redis命令Incr做计数器 + 切点切面

    Redis Incr 命令将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. package com.example.apid ...

  7. C语言常用字符串操作函数整理(详细全面)

    目录 字符串相关 1.char *gets(char *s); #include<stdio.h> 2.char *fgets(char *s, intsize, FILE *stream ...

  8. andriod sdk安装与使用

    一.进入以下网站下载 https://www.androiddevtools.cn/ 选择sdk工具-sdktools,这个工具比较好,可以通过SDK Manager下载到各种想要的包 有zip与ex ...

  9. mybatis plus 获取新增实体的主键

    转载请注明出处: mybatis plus 新增实体对象调用的是 IService 接口中的 save 方法: default boolean save(T entity) { return SqlH ...

  10. Verilog仿真实践

    Verilog必须掌握 逻辑仿真工具(VCS)和逻辑综合工具(DC) AndOR module AndOr( output X,Y, input A,B,C ); // A B进行按位与运算 assi ...