广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringBoot集成 ElasticSearch
  • 415
分享到

SpringBoot集成 ElasticSearch

elasticsearchspringbootjavamavenintellij-idea 2023-08-18 17:08:52 415人浏览 独家记忆
摘要

Spring Boot 集成 elasticsearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入

Spring Boot 集成 elasticsearch

对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介
好的开始啦~

1、基础操作

1.1、导入依赖

    org.springframework.boot    spring-boot-starter-data-elasticsearch
  • 新版本配置方式(推荐使用)

    新的配置方式使用的是 High Level REST Client 的方式来替代之前的 Transport Client 方式,使用的是 Http 请求,和 Kibana 一样使用的是 Elasticsearch 的 9200 端口。

1.2、自定义配置类

这种配置方案中,你使用的不是配置文件,而是自定义配置类:

@Configurationpublic class ESConfig extends AbstractElasticsearchConfiguration {    @Override    public RestHighLevelClient elasticsearchClient() {        ClientConfiguration clientConfiguration = ClientConfiguration.builder()            .connectedTo("localhost:9200")            .build();        return RestClients.create(clientConfiguration).rest();    }}

1.3、实体类

Elasticsearch 中的 PO 类:

@Document(indexName = "books",shards = 1,replicas = 0)@Data@AllArgsConstructor@NoArgsConstructorpublic class ESBook {    @Id    @Field(type = FieldType.KeyWord)    private String id;    @Field(type = FieldType.Text)    private String title;    @Field(type = FieldType.Keyword)    private String language;    @Field(type = FieldType.Keyword)    private String author;    @Field(type = FieldType.Float)    private Float price;    @Field(type = FieldType.Text)    private String description;}
  • @Document :注解会对实体中的所有属性建立索引
  • indexName = “books” :表示创建一个名称为 “books” 的索引;
  • shards = 1 : 表示只使用一个分片;
  • replicas = 0 : 表示不使用复制备份;
  • @Field(type = FieldType.Keyword) : 用以指定字段的数据类型。

2、 创建操作的 Repository

@Repository//看实体类Id索引是什么类型 我这里是Stringpublic interface ESBookRepstitory extends ElasticsearchRepository<ESBook, String> {    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wSibzg8-1681375145182)(assets\spring-boot-es-02.png)]

我们自定义的 CustomerRepository 接口,从它的祖先们那里继承了大量的现成的方法,除此之外,它还可以按 spring data 的规则定义特定的方法。

3、 测试 CustomerRepository

// 创建索引@Testpublic void indexList() {   System.out.println("创建索引");}// 删除索引@Testpublic void indexList() {restTemplate.indexOps(IndexCoordinates.of("books")).delete();    System.out.println("删除索引");}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HQkNX8j-1681375145182)(C:\Users\lps\AppData\Roaming\Typora\typora-user-images\image-20230413111252346.png)]

4.、CRUD操作

4.1、批量新增

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xP3YE5M7-1681375145183)(C:\Users\lps\AppData\Roaming\Typora\typora-user-images\image-20230413142657737.png)]

   @Autowired   private ESBookRepstitory  bookByESRepstitory;  @Test    public void indexList() {        List<ESBook> lists = new ArrayList<>();        lists.add(new ESBook("1", "Java 程序设计", "汉语", "盖伦",                18.88F, "哈哈嗨"));        lists.add(new ESBook("2", "python程序设计", "英语", "赵信",                66.88F, "陷阵之至有死无生"));        lists.add(new ESBook("3", "PHP 程序设计", "俄语", "宝石",                88.88F, "我曾踏足山巅,也曾跌入低谷"));        bookByESRepstitory.saveAll(lists);    }

id重复的话 会覆盖之前的~~~

4.2、修改

修改和新增是同一个接口,区分的依据就是id,这一点跟我们在页面发起PUT请求是类似的。

     ESBook ESBook = new ESBook("3", "宝石 程序设计", "俄语", "宝石",                88.88F, "我曾踏足山巅,也曾跌入低谷");        bookByESRepstitory.save(ESBook);//由于上面的id = 3 已经存在,故再次save 就是修改

4.3、删除

@Testpublic void test2(){    bookByESRepstitory.deleteById("1");    bookByESRepstitory.deleteAll();}

4.4、基本查询

1、ElasticsearchRepository提供了一些基本的查询方法:

@Testpublic void testQuery(){     Optional<BookByES> optionalById = this.bookByESRepstitory.findById("1");     System.out.println(optionalById.get());} @Test    public void testFind(){        // 查询全部,并按照价格降序排序        //写法一:         Iterable<BookByES> items = this.bookByESRepstitory.findAll(Sort.by(Sort.Direction.DESC,                "price"));        //写法二:         Iterable<BookByES> items1 = this.bookByESRepstitory.findAll(Sort.by(Sort.Order.desc("price")));    }

2、分页查询

Spring Data 自带的分页方案:

    @Test    public void testByPage(){        Sort sort = Sort.by(Sort.Direction.DESC,"id");        //分页        PageRequest pageRequest = PageRequest.of(0, 2, sort);        Page<BookByES> all = bookByESRepstitory.findAll(pageRequest);        for (BookByES bookByES : all) {            System.out.println(bookByES);        }    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7SZLIEI-1681375145183)(C:\Users\lps\AppData\Roaming\Typora\typora-user-images\image-20230413121434941.png)]

4.5、自定义方法查询

Spring Data 的另一个强大功能,是根据方法名称自动实现功能。

比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。

当然,方法名称要符合一定的约定

KeywordSampleElasticsearch Query String
AndfindByNameAndPrice{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
OrfindByNameOrPrice{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}
IsfindByName{"bool" : {"must" : {"field" : {"name" : "?"}}}}
NotfindByNameNot{"bool" : {"must_not" : {"field" : {"name" : "?"}}}}
BetweenfindByPriceBetween{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
LessThanEqualfindByPriceLessThan{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
GreaterThanEqualfindByPriceGreaterThan{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
BeforefindByPriceBefore{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}
AfterfindByPriceAfter{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}
LikefindByNameLike{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
StartingWithfindByNameStartingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}
EndingWithfindByNameEndingWith{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}
Contains/ContainingfindByNameContaining{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}}
InfindByNameIn(Collectionnames){"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}
NotInfindByNameNotIn(Collectionnames){"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}
NearfindByStoreNearNot Supported Yet !
TruefindByAvailableTrue{"bool" : {"must" : {"field" : {"available" : true}}}}
FalsefindByAvailableFalse{"bool" : {"must" : {"field" : {"available" : false}}}}
OrderByfindByAvailableTrueOrderByNameDesc{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}

如:

import com.springsecurity.domain.ESBook;import org.springframework.data.domain.Pageable;import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;import org.springframework.stereotype.Repository;import java.util.List;@Repository//看实体类Id索引是什么类型 我这里是Stringpublic interface ESBookRepstitory extends ElasticsearchRepository<ESBook, String> {        List<ESBook> findESBookByDescription(String description, Pageable variable);        List<ESBook> queryESBookByAuthorAndDescriptionOrTitle(String author,String description,String title);        List<ESBook> queryESBookByPriceBetween(Float price1,Float price2);}
@Testvoid esQueryCondition() {    Sort sort = Sort.by(Sort.Order.desc("id"));    PageRequest pageRequest = PageRequest.of(0, 2, sort);    List<ESBook> EBooks = bookByESRepstitory.findESBookByDescription("我",pageRequest);    for (ESBook bookByE : EBooks) {        System.out.println(bookByE);    }}@Testvoid esQueryCondition2() {    List<ESBook> esBooks = bookByESRepstitory.queryESBookByAuthorAndDescriptionOrTitle("盖伦", "哈嗨", "程序");    for (ESBook book : esBooks) {        System.out.println(book);    }}@Testvoid esQueryCondition3() {    List<ESBook> esBooks = bookByESRepstitory.queryESBookByPriceBetween(18.88F,77.88F);    for (ESBook book : esBooks) {        System.out.println(book);    }}

4.6、使用NativeSearchQuery

@Autowiredprivate ElasticsearchRestTemplate restTemplate;
QueryBuilders.queryStringQuery() #指定字符串作为关键词查询,关键词支持分词QueryBuilders.queryStringQuery("华为手机").defaultField("description");//不指定feild,查询范围为所有feildQueryBuilders.queryStringQuery("华为手机");//指定多个feildQueryBuilders.queryStringQuery("华为手机").field("title").field("description");QueryBuilders.boolQuery          #子方法must可多条件联查QueryBuilders.terMQuery          #精确查询指定字段不支持分词QueryBuilders.termQuery("description", "华为手机")QueryBuilders.matchQuery         #按分词器进行模糊查询支持分词QueryBuilders.matchQuery("description", "华为手机")    QueryBuilders.rangeQuery         #按指定字段进行区间范围查询- `QueryBuilders.boolQuery()`- `QueryBuilders.boolQuery().must()`:相当于 and- `QueryBuilders.boolQuery().should()`:相当于 or- `QueryBuilders.boolQuery().mustNot()`:相当于 not - ——————————————————————————————————————————————————————————————————————————————————————————————————————  @Test    void naticeQuery() {        NativeSearchQuery nativeSearchQuery =                new NativeSearchQueryBuilder()                        //.withQuery(QueryBuilders.queryStringQuery("山巅哈哈").defaultField("description"))                        //多条件查询                        .withQuery(QueryBuilders.boolQuery()    .must(QueryBuilders.queryStringQuery("山巅哈哈").defaultField("description"))    .should(QueryBuilders.queryStringQuery("宝石").defaultField("title"))                        )                        .withPageable(PageRequest.of(0, 2))                        .build();        SearchHits<ESBook> search = restTemplate.search(nativeSearchQuery, ESBook.class);        List<SearchHit<ESBook>> searchHits = search.toList();        for (SearchHit<ESBook> searchHit : searchHits) {            System.out.println(searchHit);        }    }

举个例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbyhHOcz-1681375145184)(C:\Users\lps\AppData\Roaming\Typora\typora-user-images\image-20230413160753038.png)]

5、es场景

场景一:对外暴露的数据(数据量大的)的用es,如果不需要对外暴露,不需要全文检索的话,那么直接从数据查,所以做项目分析数据分成2块(哪些数据需要放es,从es查,哪些不需要)

场景二:作为Mysql的外置索引,把作为数据库查询条件的列数据放到es里面,这样在查询的时候,先从es查询出符合条件的id,然后根据id去数据库查,数据维护大,一旦es宕机,就麻烦了

来源地址:https://blog.csdn.net/lps12345666/article/details/130134109

--结束END--

本文标题: SpringBoot集成 ElasticSearch

本文链接: https://www.lsjlt.com/news/374353.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot集成 ElasticSearch
    Spring Boot 集成 ElasticSearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入...
    99+
    2023-08-18
    elasticsearch spring boot java maven intellij-idea
  • Springboot如何集成Elasticsearch
    小编给大家分享一下Springboot如何集成Elasticsearch,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!集成配置步骤步骤1:加入 Maven 相关依...
    99+
    2023-06-22
  • springboot中如何集成elasticsearch
    这篇文章主要介绍“springboot中如何集成elasticsearch”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot中如何集成elasticsearch”文章能帮助大家解决问...
    99+
    2023-06-08
  • SpringBoot框架如何集成ElasticSearch
    这篇文章主要为大家展示了“SpringBoot框架如何集成ElasticSearch”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot框架如何集成ElasticSearch”这篇...
    99+
    2023-06-25
  • SpringBoot集成ElasticSearch的示例代码
    目录一、Elasticseach介绍1.简单介绍2.对比关系:3.详细说明:4.查出数据的解释 二、SpringBoot集成Elasticseach1.引入依赖2.添加配置...
    99+
    2022-11-13
  • SpringBoot集成elasticsearch使用图文详解
    目录前言elasticsearch简介elasticsearch使用环境安装代码演示普通查询高亮查询结束前言 此文适合了解了es相关概念以及基础知识的同学阅读 elasticsear...
    99+
    2023-05-16
    springboot集成elasticsearch springboot集成elasticsearch样例项目 springboot集成Elasticsearch
  • SpringBoot集成ElasticSearch的代码是什么
    这篇“SpringBoot集成ElasticSearch的代码是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Sprin...
    99+
    2023-06-29
  • springBoot集成Elasticsearch 报错 Health check failed的解决
    springBoot集成Elasticsearch 报错 Health check failed 今天集成Elasticsearch 时启动报错 报错信息如下: 2018-11-...
    99+
    2022-11-12
  • Springboot集成Elasticsearch的步骤与相关功能
    目录集成配置步骤步骤1:加入 Maven 相关依赖步骤2:配置 elasticsearch 的主机和端口步骤3:配置 Elaseticsearch 客户端步骤4:创建文档实体步骤5:...
    99+
    2022-11-12
  • SpringBoot框架集成ElasticSearch实现过程示例详解
    目录依赖与SpringBoot集成配置类实体类测试例子RestHighLevelClient直接操作索引操作文档操作检索操作依赖 SpringBoot版本:2.4.2 <...
    99+
    2022-11-12
  • PHP与Elasticsearch的集成
    PHP与Elasticsearch的集成随着大数据和数据挖掘的发展,搜索引擎已经成为了我们生活中必不可少的工具。而Elasticsearch就是一个快速、开放、可扩展的搜索和分析引擎,它能够轻松地进行全文检索、数据分析和实时数据的存储与查询...
    99+
    2023-05-15
    集成 PHP elasticsearch
  • Elasticsearch 介绍及java集成
    一、Elasticsearch 基础介绍 ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎,简称(ES), 成立于2012年,是一家来自荷兰的、开源的大数据搜索、分析服务提供商,为企业提供实时搜索、数据分析服务,支持PB...
    99+
    2023-09-23
    elasticsearch java 大数据
  • Spring 4+ElasticSearch如何集成
    小编给大家分享一下Spring 4+ElasticSearch如何集成,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一: ElasticSearch 基本概念IN...
    99+
    2023-06-04
  • SpringBoot集成webservice
    前言 之前在工作中,有时候需要去对接第三方的医院,而很多医院的his系统用的都是老技术(WebService)。一直在对接webservice接口,却不知道webservice接口是怎么实现的,这一次...
    99+
    2023-09-23
    spring boot java spring
  • springboot集成Ldap
    一、什么是Ldap 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过...
    99+
    2023-09-13
    spring boot 服务器 后端
  • Springboot集成GraphicsMagick
    目录以什么方式集成?项目集成1、将gm命令行工具引入到项目中2、在项目启动的时候自动初始化环境3、gm进程池化性能初测写在最后以什么方式集成? JNI / 命令行(im4java)...
    99+
    2022-11-12
  • Springboot集成Neo4j
    一、概述  1.为什么图形数据库?         生活在一个互联的世界中,大多数领域需要处理丰富的连接集以了解真正发生的事情。通常,我们发现项目之间的联系与项目本身一样重要。         虽然现有的关系数据库可以存储这些关...
    99+
    2023-09-05
    spring boot java spring
  • springboot集成websocket
    springboot集成websocket 1. 前言 ​ 这里我们使用springboot搭建一个轻量级的websocket服务,同时提供4个入参。使用websocket服务可以轻松和微信小程序、支付宝小程序、网页就行双向通讯,非常实用方...
    99+
    2023-08-16
    spring boot websocket java 支付宝小程序
  • SpringBoot随笔-SpringBoot集成Druid
    1.Druid是什么     Druid是Java语言中最好的数据库连接池之一,Druid能够提供强大的监控和扩展功能。 2.Druid连接池的优点: 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQ...
    99+
    2014-09-25
    SpringBoot随笔-SpringBoot集成Druid
  • springBoot(11):集成Mybatis
    一、添加依赖<!--mybatis--> <dependency>    <groupId>org.mybatis.spring.boot&...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作