文章目录

  • 前置导入
  • SpringBoot整合Redis
    • Redis基本介绍与安装
    • 基本操作
    • 整合
  • SpringBoot整合MongoDB
    • MongoDB基本介绍与安装
    • 基本操作
    • 整合
  • SpringBoot整合ES
    • ES基本介绍与安装
    • 基本操作
    • 整合

前置导入

NoSQL我们知道是非关系型数据库。在springboot官方文档中提供了10种相关技术的整合方案。本篇文章中将涉及国内市场上最流行的几款NoSQL数据库整合方案,分别是:

  • Redis
  • MongoDB
  • ES

上述这些技术最佳使用方案都是在Linux服务器上部署,但是本文我们还是使用Windows平台。

SpringBoot整合Redis

Redis基本介绍与安装

Redis是一款key-value存储结构的内存级NoSQL数据库:

  • 支持多种数据存储格式
  • 支持持久化
  • 支持集群

重点关注数据存储格式,是key-value格式,也就是键值对的存储形式。与MySQL数据库不同,MySQL数据库有表、有字段、有记录,Redis没有这些东西,就是一个名称对应一个值,并且数据以存储在内存中使用为主。什么叫以存储在内存中为主?其实Redis有它的数据持久化方案,分别是RDB和AOF,但是Redis自身并不是为了数据持久化而生的,主要是在内存中保存数据,加速数据访问的,所以说是一款内存级数据库。

Redis支持多种数据存储格式,比如可以直接存字符串,也可以存一个map集合,list集合,后面会涉及到一些不同格式的数据操作

windows版安装包下载地址:https://github.com/tporadowski/redis/releases

下载的安装包有两种形式,一种是一键安装的msi文件,还有一种是解压缩就能使用的zip文件

啥是msi,其实就是一个文件安装包,不仅安装软件,还帮你把安装软件时需要的功能关联在一起,打包操作。比如如安装序列、创建和设置安装路径、设置系统依赖项、默认设定安装选项和控制安装过程的属性。说简单点就是一站式服务,安装过程一条龙操作一气呵成,就是为小白用户提供的软件安装程序。

安装完毕后会得到如下文件,其中有两个文件对应两个命令,是启动Redis的核心命令,需要在CMD命令行模式执行。

启动服务器

redis-server.exe redis.windows.conf

这里我们使用的是默认6379端口

启动客户端

redis-cli.exe

​ 如果启动redis服务器失败,可以先启动客户端,然后执行shutdown操作后退出,此时redis服务器就可以正常执行了。

我们来演示一下:

首先启动服务器,发现启动失败:

然后我们继续:

再去开启服务器,ok:

出现这个图象就说明服务器已经开启成功了!

基本操作

服务器启动后,使用客户端就可以连接服务器,类似于启动完MySQL数据库,然后启动SQL命令行操作数据库。

​ 放置一个字符串数据到redis中,先为数据定义一个名称,比如name,age等,然后使用命令set设置数据到redis服务器中即可

set name nefuset age 12

​ 从redis中取出已经放入的数据,根据名称取,就可以得到对应数据。如果没有对应数据就会得到(nil)

get nameget age

例如:

以上使用的数据存储是一个名称对应一个值,如果要维护的数据过多,可以使用别的数据存储结构。例如hash,它是一种一个名称下可以存储多个数据的存储模型,并且每个数据也可以有自己的二级存储名称。向hash结构中存储数据格式如下:

hset a a1 aa1#对外key名称是a,在名称为a的存储模型中,a1这个key中保存了数据aa1hset a a2 aa2

​ 获取hash结构中的数据命令如下

hget a a1#得到aa1hget a a2#得到aa2

注意不能直接得到a

例如:

这里我们只涉及有关Redis的一些简单操作

整合

在进行整合之前先梳理一下整合的思想,springboot整合任何技术其实就是在springboot中使用对应技术的API。如果两个技术没有交集,就不存在整合的概念了。所谓整合其实就是使用springboot技术去管理其他技术,几个问题是躲不掉的:

  • 第一,需要先导入对应技术的坐标,而整合之后,这些坐标都有了一些变化

  • 第二,任何技术通常都会有一些相关的设置信息,整合之后,这些信息如何写,写在哪是一个问题

  • 第三,没有整合之前操作如果是模式A的话,整合之后如果没有给开发者带来一些便捷操作,那整合将毫无意义,所以整合后操作肯定要简化一些,那对应的操作方式自然也有所不同

按照上面的三个问题去思考springboot整合所有技术是一种通用思想,在整合的过程中会逐步摸索出整合的套路,而且适用性非常强,经过若干种技术的整合后基本上可以总结出一套固定思维。

下面就开始springboot整合redis,操作步骤如下:

步骤①:导入springboot整合redis的starter坐标

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

上述坐标可以在创建模块的时候通过勾选的形式进行选择,归属NoSQL分类中

步骤②:进行基础配置

spring:  redis:    host: localhost    port: 6379

操作redis,最基本的信息就是操作哪一台redis服务器,所以服务器地址属于基础配置信息,不可缺少。但是即便你不配置,目前也是可以用的。因为以上两组信息都有默认配置,刚好就是上述配置值。

步骤③:使用springboot整合redis的专用客户端接口操作,此处使用的是RedisTemplate

@SpringBootTestclass Springboot16RedisApplicationTests {    @Autowired    private RedisTemplate redisTemplate;    @Test    void set() {    //首先决定要操作哪种数据类型        ValueOperations ops = redisTemplate.opsForValue();        ops.set("age",41);    }    @Test    void get() {        ValueOperations ops = redisTemplate.opsForValue();        Object age = ops.get("name");        System.out.println(age);    }    @Test    void hset() {        HashOperations ops = redisTemplate.opsForHash();        ops.put("info","a","csdn");    }    @Test    void hget() {        HashOperations ops = redisTemplate.opsForHash();        Object val = ops.get("info", "a");        System.out.println(val);    }}

两组get/set的结果:

在操作redis时,需要先确认操作何种数据,根据数据种类得到操作接口。例如使用opsForValue()获取string类型的数据操作接口,使用opsForHash()获取hash类型的数据操作接口,剩下的就是调用对应api操作了。各种类型的数据操作接口如下:

总结

  1. springboot整合redis步骤
    1. 导入springboot整合redis的starter坐标
    2. 进行基础配置
    3. 使用springboot整合redis的专用客户端接口RedisTemplate操作

这里有一个注意点当我们在Redis的客户端去查找我们刚才在测试中添加的键值对时,发现查找不到。不是因为没有添加,而是因为数据类型的问题。我们可以使用命令查看此时所有储存的key:

我们发现并不是查不到,而是因为他们是以对象的形式进行存储的,并且被Redis使用特殊的方法进行了序列化,所以我们直接输入字符串是查不出来的。

我们在RedisTemplate中也可以看到:

此处使用了泛型,当我们不写任何东西的时候,它就当成了Object对象

为了避免这种情况我们可以使用StringRedisTemplate:

然后我们就可以查到了:

SpringBoot整合MongoDB

MongoDB基本介绍与安装

使用Redis技术可以有效的提高数据访问速度,但是由于Redis的数据格式单一性,无法操作结构化数据,当操作对象型的数据时,Redis就显得捉襟见肘。在保障访问速度的情况下,如果想操作结构化数据,看来Redis无法满足要求了,此时需要使用全新的数据存储结构来解决此问题

MongoDB是一个开源、高性能、无模式的文档型数据库,它是NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库

上述描述中几个词,其中对于我们最陌生的词是无模式的。什么叫无模式呢?简单说就是作为一款数据库,没有固定的数据存储结构,第一条数据可能有A、B、C一共3个字段,第二条数据可能有D、E、F也是3个字段,第三条数据可能是A、C、E3个字段,也就是说数据的结构不固定,这就是无模式。有人会说这有什么用啊?灵活,随时变更,不受约束。基于上述特点,MongoDB的应用面也会产生一些变化。以下列出了一些可以使用MongoDB作为数据存储的场景,但是并不是必须使用MongoDB的场景:

  • 淘宝用户数据

    • 存储位置:数据库
    • 特征:永久性存储,修改频度极低
  • 游戏装备数据、游戏道具数据

    • 存储位置:数据库、Mongodb
    • 特征:永久性存储与临时存储相结合、修改频度较高
  • 直播数据、打赏数据、粉丝数据

    • 存储位置:数据库、Mongodb
    • 特征:永久性存储与临时存储相结合,修改频度极高
  • 物联网数据

    • 存储位置:Mongodb
    • 特征:临时存储,修改频度飞速

简单的了解MongoDB之后我们来说说他的安装。

windows版安装包下载地址:https://www.mongodb.com/try/download

下载的安装包也有两种形式,一种是一键安装的msi文件,还有一种是解压缩就能使用的zip文件,哪种形式都行,这里采用解压缩zip文件进行安装。

解压缩完毕后会得到如下文件,其中bin目录包含了所有mongodb的可执行命令

​ mongodb在运行时需要指定一个数据存储的目录,所以创建一个数据存储目录,通常放置在安装目录中,此处创建data的目录用来存储数据(我们又在data文件夹中创建一个db文件夹同样也是用来存放数据),具体如下

​ 如果在安装的过程中出现了如下警告信息,就是告诉你,你当前的操作系统缺少了一些系统文件,这个不用担心。

根据下列方案即可解决,在浏览器中搜索提示缺少的名称对应的文件,并下载,将下载的文件拷贝到windows安装目录的system32目录下,然后在命令行中执行regsvr32命令注册此文件。根据下载的文件名不同,执行命令前更改对应名称。

regsvr32 vcruntime140_1.dll

启动服务器

mongod --dbpath=..\data\db

启动服务器时需要指定数据存储位置,通过参数–dbpath进行设置,可以根据需要自行设置数据存储路径。默认服务端口27017

然后我们进入data里面的db文件夹会发现多了一些东西:

这些文件是初始化用的只会生成一次,后续开启服务器是不会再次生成的。

然后我们再启动客户端:

启动客户端

mongo --host=127.0.0.1 --port=27017

因为我们的设置都是默认的,所以运行的时候,直接mongo也是可以的

出现如下界面说明成功:

注意别把服务器关了,两个cmd窗口要同时存在

基本操作

​ MongoDB虽然是一款数据库,但是它的操作并不是使用SQL语句进行的,因此操作方式各位小伙伴可能比较陌生,好在有一些类似于Navicat的数据库客户端软件,能够便捷的操作MongoDB,先安装一个客户端,再来操作MongoDB。

同类型的软件较多,本次安装的软件时Robo3t,Robot3t是一款绿色软件,无需安装,解压缩即可。解压缩完毕后进入安装目录双击robot3t.exe即可使用。

打开软件首先要连接MongoDB服务器,选择【File】菜单,选择【Connect…】

进入连接管理界面后,选择左上角的【Create】链接,创建新的连接设置

​ 如果输入设置值即可连接(默认不修改即可连接本机27017端口)

连接成功后在命令输入区域输入命令即可操作MongoDB。

创建数据库:在左侧菜单中使用右键创建,输入数据库名称即可

创建集合:在Collections上使用右键创建,输入集合名称即可,集合等同于数据库中的表的作用

新增文档:(文档是一种类似json格式的数据,但它实际并不是json数据)

db.集合名称.insert/save/insertOne(文档)

例如:

结果:

删除文档

db.集合名称.remove(条件)

修改文档

db.集合名称.update(条件,{操作种类:{文档}})

查询文档

基础查询查询全部:   db.集合.find();查第一条:   db.集合.findOne()查询指定数量文档:db.集合.find().limit(10)//查10条文档跳过指定数量文档:db.集合.find().skip(20)//跳过20条文档统计:  db.集合.count()排序:db.集合.sort({age:1})//按age升序排序投影:db.集合名称.find(条件,{name:1,age:1}) //仅保留name与age域条件查询基本格式:db.集合.find({条件})模糊查询:db.集合.find({域名:/正则表达式/})  //等同SQL中的like,比like强大,可以执行正则所有规则条件比较运算:   db.集合.find({域名:{$gt:值}})//等同SQL中的数值比较操作,例如:name>18包含查询:db.集合.find({域名:{$in:[值1,值2]}})//等同于SQL中的in条件连接查询:   db.集合.find({$and:[{条件1},{条件2}]})   //等同于SQL中的and、or

这里只涉及一些基础的MongoDB操作

整合

使用springboot整合MongDB该如何进行呢?其实springboot为什么使用的开发者这么多,就是因为他的套路几乎完全一样。导入坐标,做配置,使用API接口操作。整合Redis如此,整合MongoDB同样如此。

​ 第一,先导入对应技术的整合starter坐标

​ 第二,配置必要信息

​ 第三,使用提供的API操作即可

​ 下面就开始springboot整合MongoDB,操作步骤如下:

步骤①:导入springboot整合MongoDB的starter坐标

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

​ 上述坐标也可以在创建模块的时候通过勾选的形式进行选择,同样归属NoSQL分类中

步骤②:进行基础配置

spring:  data:    mongodb:      uri: mongodb://localhost/nefu   #我们对nefu集合进行操作

操作MongoDB需要的配置与操作redis一样,最基本的信息都是操作哪一台服务器,区别就是连接的服务器IP地址和端口不同,书写格式不同而已。

步骤③:使用springboot整合MongoDB的专用客户端接口MongoTemplate来进行操作

@SpringBootTestclass Springboot17MongodbApplicationTests {    @Autowired    private MongoTemplate mongoTemplate;    @Test    void contextLoads() {        Book book = new Book();        book.setId(2);        book.setName("springboot2");        book.setType("springboot2");        book.setDescription("springboot2");        mongoTemplate.save(book);    }    @Test    void find(){        List<Book> all = mongoTemplate.findAll(Book.class);        System.out.println(all);    }}

在执行完save操作之后,我们可以在数据库中查看到新的数据:

整合工作到这里就做完了,感觉既熟悉也陌生。熟悉的是这个套路,三板斧,就这三招,导坐标做配置用API操作,陌生的是这个技术,里面具体的操作API可能会不熟悉,有关springboot整合MongoDB我们就讲到这里。

总结

  1. springboot整合MongoDB步骤
    1. 导入springboot整合MongoDB的starter坐标
    2. 进行基础配置
    3. 使用springboot整合MongoDB的专用客户端接口MongoTemplate操作

SpringBoot整合ES

ES基本介绍与安装

NoSQL解决方案已经讲完了两种技术的整合了,Redis可以使用内存加载数据并实现数据快速访问,MongoDB可以在内存中存储类似对象的数据并实现数据的快速访问,在企业级开发中对于速度的追求是永无止境的。下面要讲的内容也是一款NoSQL解决方案,只不过他的作用不是为了直接加速数据的读写,而是加速数据的查询的,叫做ES技术

​ ES(Elasticsearch)是一个分布式全文搜索引擎,重点是全文搜索。

那什么是全文搜索呢?比如用户要买一本书,以Java为关键字进行搜索,不管是书名中还是书的介绍中,甚至是书的作者名字,只要包含java就作为查询结果返回给用户查看,上述过程就使用了全文搜索技术。搜索的条件不再是仅用于对某一个字段进行比对,而是在一条数据中使用搜索条件去比对更多的字段,只要能匹配上就列入查询结果,这就是全文搜索的目的。而ES技术就是一种可以实现上述效果的技术。

要实现全文搜索的效果,不可能使用数据库中like操作去进行比对,这种效率太低了。ES设计了一种全新的思想,来实现全文搜索。具体操作过程如下:

  1. 将被查询的字段的数据全部文本信息进行查分,分成若干个词

    • 例如“Spring实战第5版”就会被拆分成三个词,分别是“Spring”、“实战”、“第5版”,此过程有专业术语叫做分词。分词的策略不同,分出的效果不一样,不同的分词策略称为分词器。
  2. 将分词得到的结果存储起来,对应每条数据的id

    • 例如id为1的数据中名称这一项的值是“Spring实战第5版”,那么分词结束后,就会出现“Spring”对应id为1,“实战”对应id为1,“第5版”对应id为1

    • 例如id为3的数据中名称这一项的值是“Spring5设计模式“,那么分词结束后,就会出现“Spring”对应id为3,“设计模式”对应id为3

    • 此时就会出现如下对应结果,按照上述形式可以对所有文档进行分词。需要注意分词的过程不是仅对一个字段进行,而是对每一个参与查询的字段都执行,最终结果汇总到一个表格中

    这样的一条数据就可以称为一个文档:

    分词结果关键字对应id
    Spring1,2,3,4,5
    实战1
    第5版1
  3. 当进行查询时,如果输入“实战”作为查询条件,可以通过上述表格数据进行比对,得到id值1,然后根据id值就可以得到查询的结果数据了。

上述过程中分词结果关键字内容每一个都不相同,作用有点类似于数据库中的索引,是用来加速数据查询的。但是数据库中的索引是对某一个字段进行添加索引,而这里的分词结果关键字不是一个完整的字段值,只是一个字段中的其中的一部分内容。并且索引使用时是根据索引内容查找整条数据,全文搜索中的分词结果关键字查询后得到的并不是整条的数据,而是数据的id,要想获得具体数据还要再次查询,因此这里为这种分词结果关键字起了一个全新的名称,叫做倒排索引

接下来我们说说安装:
windows版安装包下载地址:https://www.elastic.co/cn/downloads/elasticsearch

​ 下载的安装包是解压缩就能使用的zip文件,解压缩完毕后会得到如下文件

  • bin目录:包含所有的可执行命令
  • config目录:包含ES服务器使用的配置文件
  • jdk目录:此目录中包含了一个完整的jdk工具包,版本17,当ES升级时,使用最新版本的jdk确保不会出现版本支持性不足的问题
  • lib目录:包含ES运行的依赖jar文件
  • logs目录:包含ES运行后产生的所有日志文件
  • modules目录:包含ES软件中所有的功能模块,也是一个一个的jar包。和jar目录不同,jar目录是ES运行期间依赖的jar包,modules是ES软件自己的功能jar包
  • plugins目录:包含ES软件安装的插件,默认为空

启动服务器

elasticsearch.bat

双击elasticsearch.bat文件即可启动ES服务器,默认服务端口9200。通过浏览器访问http://localhost:9200看到如下信息视为ES服务器正常启动

运行的过程中,有两个端口号需要记住一下:
9300端口:为elasticsearch集群件组件的通信端口,简单说就是elasticsearch内部通信的端口。
9200端口:浏览器的访问端口。

有时候运行也会报如下的error:

GeoIP报的错误, GeoIP processor | Elasticsearch Guide [7.14] | Elastic

错误信息主要是

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

解决方法如下,就是在下载jre的security目录下加入ssh的安全证书。不过不影响运行所以可以不解决。

解决PKIX:解决办法

有些用户可能在点击elasticsearch.bat文件之后,cmd弹窗出来了显示几行文字之后自动关闭了,遇到这种情况再开几次,直到正常运行即可。

基本操作

ES中保存有我们要查询的数据,只不过格式和数据库存储数据格式不同而已。在ES中我们要先创建倒排索引,这个索引的功能又点类似于数据库的表,然后将数据添加到倒排索引中,添加的数据称为文档。所以要进行ES的操作要先创建索引,再添加文档,这样才能进行后续的查询操作。

​ 要操作ES可以通过Rest风格的请求来进行,也就是说发送一个请求就可以执行一个操作。比如新建索引,删除索引这些操作都可以使用发送请求的形式来进行。

  • 创建索引,books是索引名称,下同

    PUT请求http://localhost:9200/books

    发送请求后,看到如下信息即索引创建成功

    {    "acknowledged": true,    "shards_acknowledged": true,    "index": "books"}

    重复创建已经存在的索引会出现错误信息,reason属性中描述错误原因

    {    "error": {        "root_cause": [            {                "type": "resource_already_exists_exception",                "reason": "index [books/VgC_XMVAQmedaiBNSgO2-w] already exists",                "index_uuid": "VgC_XMVAQmedaiBNSgO2-w",                "index": "books"            }        ],        "type": "resource_already_exists_exception",        "reason": "index [books/VgC_XMVAQmedaiBNSgO2-w] already exists",# books索引已经存在        "index_uuid": "VgC_XMVAQmedaiBNSgO2-w",        "index": "book"    },    "status": 400}
  • 查询索引

    GET请求http://localhost:9200/books

    查询索引得到索引相关信息,如下

    {    "book": {        "aliases": {},        "mappings": {},        "settings": {            "index": {                "routing": {                    "allocation": {                        "include": {                            "_tier_preference": "data_content"                        }                    }                },                "number_of_shards": "1",                "provided_name": "books",                "creation_date": "1645768584849",                "number_of_replicas": "1",                "uuid": "VgC_XMVAQmedaiBNSgO2-w",                "version": {                    "created": "7160299"                }            }        }    }}

    如果查询了不存在的索引,会返回错误信息,例如查询名称为book的索引后信息如下

    {    "error": {        "root_cause": [            {                "type": "index_not_found_exception",                "reason": "no such index [book]",                "resource.type": "index_or_alias",                "resource.id": "book",                "index_uuid": "_na_",                "index": "book"            }        ],        "type": "index_not_found_exception",        "reason": "no such index [book]",# 没有book索引        "resource.type": "index_or_alias",        "resource.id": "book",        "index_uuid": "_na_",        "index": "book"    },    "status": 404}
  • 删除索引

    DELETE请求http://localhost:9200/books

    删除所有后,给出删除结果

    {    "acknowledged": true}

    如果重复删除,会给出错误信息,同样在reason属性中描述具体的错误原因

    {    "error": {        "root_cause": [            {                "type": "index_not_found_exception",                "reason": "no such index [books]",                "resource.type": "index_or_alias",                "resource.id": "book",                "index_uuid": "_na_",                "index": "book"            }        ],        "type": "index_not_found_exception",        "reason": "no such index [books]",# 没有books索引        "resource.type": "index_or_alias",        "resource.id": "book",        "index_uuid": "_na_",        "index": "book"    },    "status": 404}
  • 创建索引并指定分词器

    ​ 前面创建的索引是未指定分词器的,可以在创建索引时添加请求参数,设置分词器。目前国内较为流行的分词器是IK分词器,使用前先在下对应的分词器,然后使用。
    IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

    ​ 分词器下载后解压到ES安装目录的plugins目录中即可,安装分词器后需要重新启动ES服务器。使用IK分词器创建索引格式:

    PUT请求http://localhost:9200/books请求参数如下(注意是json格式的参数){    "mappings":{#定义mappings属性,替换创建索引时对应的mappings属性        "properties":{#定义索引中包含的属性设置            "id":{#设置索引中包含id属性                "type":"keyword"#当前属性可以被直接搜索            },            "name":{#设置索引中包含name属性                "type":"text",              #当前属性是文本信息,参与分词                  "analyzer":"ik_max_word",   #使用IK分词器进行分词                             "copy_to":"all"#分词结果拷贝到all属性中            },            "type":{                "type":"keyword"            },            "description":{                "type":"text",                                "analyzer":"ik_max_word",                                "copy_to":"all"            },            "all":{#定义属性,用来描述多个字段的分词结果集合,当前属性可以参与查询                "type":"text",                                "analyzer":"ik_max_word"            }        }    }}

    ​ 创建完毕后返回结果和不使用分词器创建索引的结果是一样的,此时可以通过查看索引信息观察到添加的请求参数mappings已经进入到了索引属性中

    {    "books": {        "aliases": {},        "mappings": {#mappings属性已经被替换            "properties": {                "all": {                    "type": "text",                    "analyzer": "ik_max_word"                },                "description": {                    "type": "text",                    "copy_to": [                        "all"                    ],                    "analyzer": "ik_max_word"                },                "id": {                    "type": "keyword"                },                "name": {                    "type": "text",                    "copy_to": [                        "all"                    ],                    "analyzer": "ik_max_word"                },                "type": {                    "type": "keyword"                }            }        },        "settings": {            "index": {                "routing": {                    "allocation": {                        "include": {                            "_tier_preference": "data_content"                        }                    }                },                "number_of_shards": "1",                "provided_name": "books",                "creation_date": "1645769809521",                "number_of_replicas": "1",                "uuid": "DohYKvr_SZO4KRGmbZYmTQ",                "version": {                    "created": "7160299"                }            }        }    }}

目前我们已经有了索引了,但是索引中还没有数据,所以要先添加数据,ES中称数据为文档,下面进行文档操作。

  • 添加文档,有三种方式

    POST请求http://localhost:9200/books/_doc#使用系统生成idPOST请求http://localhost:9200/books/_create/1#使用指定idPOST请求http://localhost:9200/books/_doc/1#使用指定id,不存在创建,存在更新(版本递增)文档通过请求参数传递,数据格式json{    "name":"springboot",    "type":"springboot",    "description":"springboot"}  
  • 查询文档

    GET请求http://localhost:9200/books/_doc/1 #查询单个文档 GET请求http://localhost:9200/books/_search #查询全部文档
  • 条件查询

    GET请求http://localhost:9200/books/_search" /> +            "        \"properties\":{\n" +            "            \"id\":{\n" +            "                \"type\":\"keyword\"\n" +            "            },\n" +            "            \"name\":{\n" +            "                \"type\":\"text\",\n" +            "                \"analyzer\":\"ik_max_word\",\n" +            "                \"copy_to\":\"all\"\n" +            "            },\n" +            "            \"type\":{\n" +            "                \"type\":\"keyword\"\n" +            "            },\n" +            "            \"description\":{\n" +            "                \"type\":\"text\",\n" +            "                \"analyzer\":\"ik_max_word\",\n" +            "                \"copy_to\":\"all\"\n" +            "            },\n" +            "            \"all\":{\n" +            "                \"type\":\"text\",\n" +            "                \"analyzer\":\"ik_max_word\"\n" +            "            }\n" +            "        }\n" +            "    }\n" +            "}";    //设置请求中的参数    request.source(json, XContentType.JSON);    client.indices().create(request, RequestOptions.DEFAULT);}

    ​ IK分词器是通过请求参数的形式进行设置的,设置请求参数使用request对象中的source方法进行设置,至于参数是什么,取决于你的操作种类。当请求中需要参数时,均可使用当前形式进行参数设置。

    添加文档

    @Test//添加文档void testCreateDoc() throws IOException {    Book book = bookDao.selectById(1);    IndexRequest request = new IndexRequest("books").id(book.getId().toString());    String json = JSON.toJSONString(book);    request.source(json,XContentType.JSON);    client.index(request,RequestOptions.DEFAULT);}

    ​ 添加文档使用的请求对象是IndexRequest,与创建索引使用的请求对象不同。

    批量添加文档

    @Test//批量添加文档void testCreateDocAll() throws IOException {    List<Book> bookList = bookDao.selectList(null);    BulkRequest bulk = new BulkRequest();    for (Book book : bookList) {        IndexRequest request = new IndexRequest("books").id(book.getId().toString());        String json = JSON.toJSONString(book);        request.source(json,XContentType.JSON);        bulk.add(request);    }    client.bulk(bulk,RequestOptions.DEFAULT);}

    ​ 批量做时,先创建一个BulkRequest的对象,可以将该对象理解为是一个保存request对象的容器,将所有的请求都初始化好后,添加到BulkRequest对象中,再使用BulkRequest对象的bulk方法,一次性执行完毕。

    按id查询文档

    @Test//按id查询void testGet() throws IOException {    GetRequest request = new GetRequest("books","1");    GetResponse response = client.get(request, RequestOptions.DEFAULT);    String json = response.getSourceAsString();    System.out.println(json);}

    ​ 根据id查询文档使用的请求对象是GetRequest。

    按条件查询文档

    @Test//按条件查询void testSearch() throws IOException {    SearchRequest request = new SearchRequest("books");    SearchSourceBuilder builder = new SearchSourceBuilder();    builder.query(QueryBuilders.termQuery("all","spring"));    request.source(builder);    SearchResponse response = client.search(request, RequestOptions.DEFAULT);    SearchHits hits = response.getHits();    for (SearchHit hit : hits) {        String source = hit.getSourceAsString();        //System.out.println(source);        Book book = JSON.parseObject(source, Book.class);        System.out.println(book);    }}

    ​ 按条件查询文档使用的请求对象是SearchRequest,查询时调用SearchRequest对象的termQuery方法,需要给出查询属性名,此处支持使用合并字段,也就是前面定义索引属性时添加的all属性。

    springboot整合ES的操作到这里就说完了,与前期进行springboot整合redis和mongodb的差别还是蛮大的,主要原始就是我们没有使用springboot整合ES的客户端对象。至于操作,由于ES操作种类过多,所以显得操作略微有点复杂。

    总结

    1. springboot整合ES步骤
      1. 导入springboot整合ES的High Level Client坐标
      2. 手工管理客户端对象,包括初始化和关闭操作
      3. 使用High Level Client根据操作的种类不同,选择不同的Request对象完成对应操作