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. Serverless遇到 FinOps: Economical Serverless

    摘要:本文基于FunctionGraph在Serverless 领域的FinOps探索和实践,提出业界首个Serverless函数总成本估计模型 历川:华为云Serverless研发专家 平山:华为云 ...

  2. 百度高德地图行政区域边界GeoJSON数据获取并绘制行政区域

    highcharts 是提供地图数据包的:https://www.highcharts.com/docs/maps/map-collection echart矢量地图或者地图绘制矢量图层,GeoJSO ...

  3. 广告策划师如何做 AB 测试

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近年来,随着消费者的心理需求逐步趋向于精神层面.科技的迭代迅速以及市场环境的复杂性逐步上升,我国的广告行业逐步展开 ...

  4. 看火山引擎DataLeap如何做好电商治理(一):挑战与痛点

    现在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式.根据中国电子商会发布的<中国社交电商行业发展白皮书(2022)>的数据显示,2022年社交电商市场交易规模达到28542.8 ...

  5. C# WPF 将第三方DLL嵌入 exe

    没成功,只是做个记录,后面再研究 希望将第三方的 HandyControl.dll 嵌入到 exe 中,这样不用发多个文件给别人 将第三方DLL.加载到解决方案中 添加引用 将"属性页&qu ...

  6. ngix反向代理服务器

    Nginx ("engine x") 是一个高性能的HTTP 和反向代理 服务器,在大负载的情况下表现十分优秀. 1.正向代理 正向代理也是大家最常接触的到的代理模式.正向代理最大 ...

  7. 【调试】ftrace(三)trace-cmd和kernelshark

    之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd trace-cmd安装教程 安装trace-cmd及其依赖库 git c ...

  8. STM32CubeMX教程18 DAC - DMA输出自定义波形

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...

  9. 01_设计一个有getMin功能的栈

    01_设计一个有getMin功能的栈 [题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] pop.push.getMin操作的时间复杂度都是O(1) 设计 ...

  10. 基于python的租房网站-房屋出租租赁系统(python+django+vue)

    该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品.欢迎大家提出宝贵建议. 功能介绍 平台采用B/S结构,后端采用主流的Python+Django进行 ...