Spring Boot 集成Elasticsearch模块实现简单查询功能

目录
  • 背景
  • 系统集成
    • 引入jar包
    • application.yml文件中添加ES配置
    • 创建文档实体
  • 接口实现
  • 具体实现
    • 基础查询
    • 新增文档
    • 请求参数
    • Controller实现
    • 返回结果
    • 修改文档
    • 通过id查询文档信息
    • Controller实现
    • 删除文档
    • Controller实现
    • 分页查询
    • Controller实现
    • 返回结果
    • 模糊查询
    • Controller实现
    • 范围查询
    • Controller实现
  • 总结

背景

项目中我们经常会用搜索功能,普通的搜索我们可以用一个SQL的like也能实现匹配,但是搜索的核心需求是全文匹配,对于全文匹配,数据库的索引是根本派不上用场的,那只能全表扫描。全表扫描的速度已经非常慢了,还需要在每条记录上做全文匹配,一个字一个字的比对,导致查询的数据更慢。所以,使用数据来做搜索,性能上完全没法满足要求。所以我们需要采用Elasticsearch来实现检索,本文将介绍SpringBoot如何集成Elasticsearch?

系统集成

引入jar包

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  </dependency>

application.yml文件中添加ES配置

  elasticsearch:
    rest:
      uris: http://localhost:9200 

注意:不同的ES版本,引入jar包和配送属性文件的方式不同,本文采用的是Spring Boot 2.2+Elasticsearch7.0的版本。

创建文档实体

@Document(indexName = "product", createIndex = true)
public class Product implements Serializable
{
    private static final long serialVersionUID = -2408117939493050954L;

    @Id
    @Field(type = FieldType.Text)
    private String id;

    @Field(type = FieldType.Text)
    private String skuNo;

    @Field(type = FieldType.Text)
    private String tilte;

    @Field(type = FieldType.Double)
    private BigDecimal price;

    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Date createDate;
  }  

说明:

  • indexName:索引的名称
  • createIndex:ture表示如果不存在,则创建
  • @Id:索引id
  • @Field:type字段的类型,format:查询出时间格式化类型。

接口实现

public interface EsProductRepository extends ElasticsearchRepository<Product,String>
{
    List<Product> findByskuNoAndTilte(String sku,String title);
}

说明:集成ElasticsearchRepository接口,采用的是JPA的方式实现,JPA默认提供了相关的接口实现。

具体实现

Elasticsearch的实现分为基础查询和DSL查询。

基础查询

基础查询主要包含的CRUD查询,以及一些模糊、范围查询等。

新增文档

请求参数

{
     "id":"5",
     "skuNo":"sku0005",
     "tilte":"红楼梦",
      "price":"93.37",
      "createDate":"1514736000000"
}

说明:date类型传入的参数为long类型。

Controller实现

 @PostMapping("/addProduct")
    public Result addProduct(@RequestBody Product product)
    {
        esProductRepository.save(product);
        Result result = new Result();
        result.setCode(200);
        result.setData(product);
        return result;
    }

返回结果

{
    "data": {
        "id": "5",
        "skuNo": "sku0005",
        "tilte": "红楼梦",
        "price": 93.37,
        "createDate": "2017-12-31T16:00:00.000+00:00"
    },
    "code": 200,
    "msg": null
}

修改文档

修改与新增基本相同,唯一区别为:请求参数传入的Id,如果存在则为修改,否则为新增。

通过id查询文档信息

Controller实现

   @GetMapping("/getProductById")
    public Result getProductById(@RequestParam String id) {
        Optional<Product> product = esProductRepository.findById(id);
        return Result.success(product);
    }

删除文档

Controller实现

    @PostMapping("/deleteById")
    public Result deleteById(@RequestParam String id)
    {
        return  Result.success(null);
    }

分页查询

Controller实现

 @GetMapping("/getPageList")
    public Result getPageList(@RequestParam int pageNum,@RequestParam int pageSize)
    {
        Pageable pageable = PageRequest.of(pageNum, pageSize);
        Page<Product> pageList= esProductRepository.findAll(pageable);
        return Result.success(pageList);
    }

返回结果

{
    "data": {
        "content": [
            {
                "id": "1",
                "skuNo": "p0001",
                "tilte": null,
                "price": 99.9,
                "createDate": null
            },
            {
                "id": "3",
                "skuNo": "p0002",
                "tilte": null,
                "price": 99.8,
                "createDate": null
            },
            {
                "id": "4",
                "skuNo": "p0004",
                "tilte": null,
                "price": 110,
                "createDate": null
            },
            {
                "id": "L1zuVYEBuycvlc7eiQ7_",
                "skuNo": "sku0001",
                "tilte": "水浒传",
                "price": 93.37,
                "createDate": "1970-01-01T05:37:00.611+00:00"
            },
            {
                "id": "5",
                "skuNo": "sku0005",
                "tilte": "红楼梦",
                "price": 93.37,
                "createDate": "2017-12-31T16:00:00.000+00:00"
            }
        ],
        "pageable": {
            "sort": {
                "sorted": false,
                "unsorted": true,
                "empty": true
            },
            "offset": 0,
            "pageSize": 5,
            "pageNumber": 0,
            "paged": true,
            "unpaged": false
        },
        "aggregations": null,
        "scrollId": null,
        "maxScore": 1.0,
        "totalPages": 1,
        "totalElements": 5,
        "number": 0,
        "size": 5,
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "numberOfElements": 5,
        "first": true,
        "last": true,
        "empty": false
    },
    "code": 200,
    "msg": null
}

说明:

  • totalPages:总页数
  • totalElements:总记录数

模糊查询

Controller实现

   @GetMapping("/findByTilteLike")
    public Result findByTilteLike(@RequestParam String key) {
        List<Product> products = esProductRepository.findByTilteLike(key);
        return Result.success(products);
    }

说明:模糊查询通过findByxxlike

范围查询

范围查询通常是指>、< >= <=等

Controller实现

  @GetMapping("/findByPriceGreaterThanEqual")
    public Result findByPriceGreaterThanEqual(@RequestParam Double price) {
        List<Product> products = esProductRepository.findByPriceGreaterThanEqual(price);
        return Result.success(products);
    }

说明:范围查询通过findByxxGreaterThanEqual

  • 大于:GreaterThan
  • 大于等于:GreaterThanEqual
  • 小于:LessThan
  • 小于等于:LessThanEqual

总结

本文讲解了Spring Boot集成Elasticsearch采用的是ES模板的方式实现基础查询,关于相关的高级查询将在一下章进行讲解,如有疑问请随时反馈。

到此这篇关于Spring Boot 集成Elasticsearch模块实现简单查询功能的文章就介绍到这了,更多相关Spring Boot 集成Elasticsearch查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程详解

    注意:适用于springboot或者springcloud框架 1.首先下载相关文件 2.然后需要去启动相关的启动文件 3.导入相关jar包(如果有相关的依赖包不需要导入)以及配置配置文件,并且写一个dao接口继承一个类,在启动类上标注地址 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> &l

  • Spring Boot整合ElasticSearch实现多版本兼容的方法详解

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和SpringBoot进行结合使用. ElasticSearch介绍 ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行封装,提供了 REST API 的操作接口 ElasticSearch作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速地对大数据进行存储,搜索和分析.

  • springBoot集成Elasticsearch 报错 Health check failed的解决

    springBoot集成Elasticsearch 报错 Health check failed 今天集成Elasticsearch 时启动报错 报错信息如下: 2018-11-01 20:52:51.310 INFO [hstao-supersearch,,,] 8528 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8009 2018-11-01 20:52:51.314 INFO [hstao

  • Spring Boot集成ElasticSearch实现搜索引擎的示例

    Elastic Search是一个开源的,分布式,实时搜索和分析引擎.Spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置.Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-elasticsearch 'StarterPOM'. ElasticSearch作为搜索引擎,我们需要解决2大问题: 1,  如何将被搜索的数据在ES上创建反向索引 2,  Java代码如何与E

  • SpringBoot整合Elasticsearch游标查询的示例代码(scroll)

    游标查询(scroll)简介 scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价. 游标查询会取某个时间点的快照数据. 查询初始化之后索引上的任何变化会被它忽略. 它通过保存旧的数据文件来实现这个特性,结果就像保留初始化时的索引 视图 一样. 启用游标查询可以通过在查询的时候设置参数 scroll 的值为我们期望的游标查询的过期时间. 游标查询的过期时间会在每次做查询的时候刷新,所以这个时间只需要足够处理当前批的结果就可以了,而不

  • SpringBoot整合Elasticsearch并实现CRUD操作

     配置准备 在build.gradle文件中添加如下依赖: compile "org.elasticsearch.client:transport:5.5.2" compile "org.elasticsearch:elasticsearch:5.5.2" //es 5.x的内部使用的 apache log4日志 compile "org.apache.logging.log4j:log4j-core:2.7" compile "org

  • SpringBoot 整合 ElasticSearch操作各种高级查询搜索

    目录 一.简介 二.代码实践 三.小结 一.简介 在上篇​SpringBoot 整合 ElasticSearch​​​文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法! 本文将重点介绍 ES 的各种高级查询写法和使用. 废话不多说,直接上代码! 二.代码实践 本文采用的SpringBoot版本号是2.1.0.RELEASE,服务端 es 的版本号是6.8.2,客户端采用的是官方推荐的Elastic Java High Level Rest Client版

  • Spring Boot 集成Elasticsearch模块实现简单查询功能

    目录 背景 系统集成 引入jar包 application.yml文件中添加ES配置 创建文档实体 接口实现 具体实现 基础查询 新增文档 请求参数 Controller实现 返回结果 修改文档 通过id查询文档信息 Controller实现 删除文档 Controller实现 分页查询 Controller实现 返回结果 模糊查询 Controller实现 范围查询 Controller实现 总结 背景 项目中我们经常会用搜索功能,普通的搜索我们可以用一个SQL的like也能实现匹配,但是搜索

  • Spring Boot 集成接口管理工具 Knife4j

    目录 前言 集成过程 创建 Spring Boot 项目 添加依赖 配置添加 编写 Controller 层 启动测试 踩过的坑 空指针异常 请求路径未找到 总结 前言 之前介绍了如何在 Spring Boot 中集成 Swagger2 和 Swagger3,对于我们日常的接口管理已经够用了.但是作为一个颜值党,无论是 Swagger2 还是 Swagger3,都难以满足我们的审美.而且 Swagger2 和 Swagger3 都已经好久没更新了,更新还是比较慢的. 偶然之间发现了一个国产的接口

  • Spring Boot整合Elasticsearch实现全文搜索引擎案例解析

    简单说,ElasticSearch(简称 ES)是搜索引擎,是结构化数据的分布式搜索引擎.Elastic Search是一个开源的,分布式,实时搜索和分析引擎.Spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置.Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-elasticsearch 'StarterPOM'. 引入spring-boot-starter-dat

  • spring boot集成rabbitmq的实例教程

    一.RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,现已经转让给apache). 消息中间件的工作过程可以用生产者消费者模型来表示.即,生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息.具体过程如下: 从上图可看出,对于消息队列来说,生产者,消息队列,消费者是最重要的三个概念,生产者发消息到消息队列中去,消费者监听指定的消息

  • spring boot集成pagehelper(两种方式)

    参看了pagehelper-spring-boot,使用起来非常放方便,关于更多PageHelper可以点击https://github.com/pagehelper/Mybatis-PageHelper. 当spring boot集成好mybatis时候需要进行分页,我们首先添加maven支持 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</a

  • Spring Boot集成Swagger2项目实战

    一.Swagger简介 上一篇文章中我们介绍了Spring Boot对Restful的支持,这篇文章我们继续讨论这个话题,不过,我们这里不再讨论Restful API如何实现,而是讨论Restful API文档的维护问题. 在日常的工作中,我们往往需要给前端(WEB端.IOS.Android)或者第三方提供接口,这个时候我们就需要给他们提供一份详细的API说明文档.但维护一份详细的文档可不是一件简单的事情.首先,编写一份详细的文档本身就是一件很费时费力的事情,另一方面,由于代码和文档是分离的,所

  • 使用Spring Boot集成FastDFS的示例代码

    这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包配置 我们使用Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0. <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>

  • Spring boot 集成Dubbox的方法示例

    前言 因为工作原因,需要在项目中集成dubbo,所以去查询dubbo相关文档,发现dubbo目前已经不更新了,所以把目光投向了dubbox,dubbox是当当网基于dubbo二次开发的一个项目,dubbox,因为公司项目中一个是基于spring mvc 3.0的,一个是基于spring boot的,而spring boot相对来说文档少一点,所以此文记录下spring boot下如何继承dubbox 一.安装zookeeper 1.zookeeper简介 ZooKeeper是一个分布式的,开放源

  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法. 关于MyBatis,大部分人都很熟悉.MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Pla

随机推荐