第六章(nk)
![](https://img.haomeiwen.com/i12358679/5a6639e868be4e31.png)
6.1 ES入门
![](https://img.haomeiwen.com/i12358679/35a2ab484d6b4804.png)
要使用ES进行搜索,数据需要在ES里面再存储一份。
可以将其是一种特殊的数据库。
索引,类型,文档,字段分别对应于数据库中的库,表,行,列。
一行数据一般采用json的格式,json里面的每一个属性是一个字段。
但是在ES6.0之后,一些概念发生了变化。一个索引表示一张表,类型逐渐被废弃。索引表示一张表,文档表示一行数据,字段表示一列数据。但是后面的内容还会用到类型概念,所以稍作提示。
和集群有关的概念:
多个服务器组合在一起叫做集群,其中的每一台叫做节点。分片是指将索引拆成多个分片进行存储。因为索引里面的内容可能会比较大,也就是表可能会比较大。拆分之后,有利于并发地进行操作。副本是对分片的备份,一个分片可能包括多个副本。
---- 查看文档
![](https://img.haomeiwen.com/i12358679/4f9750caca3fac57.png)
---下载产品
![](https://img.haomeiwen.com/i12358679/6aa26b4d0dc694fe.png)
不下载最新的文件,因为springboot的pom.xml的父pom文件中规定的ES版本是6.4。
![](https://img.haomeiwen.com/i12358679/7e454d9bd066223a.png)
下载的是ES6.4.3,然后修改配置
![](https://img.haomeiwen.com/i12358679/9de3b946f2a96c77.png)
![](https://img.haomeiwen.com/i12358679/a90bb018cfcdfd68.png)
集群的名字:
![](https://img.haomeiwen.com/i12358679/07e8687e15104523.png)
![](https://img.haomeiwen.com/i12358679/dfe57bbe9b29e431.png)
往ES中存的数据存到了哪里:
![](https://img.haomeiwen.com/i12358679/b952b7af1dd8d1ee.png)
![](https://img.haomeiwen.com/i12358679/d6980aa6c28f2c90.png)
运行日志的存放地:
![](https://img.haomeiwen.com/i12358679/3f3fdc5ab5cbb49f.png)
![](https://img.haomeiwen.com/i12358679/cb8040bebf1a2ad0.png)
--接着配置环境变量
![](https://img.haomeiwen.com/i12358679/db4d82e0b0f5d69b.png)
![](https://img.haomeiwen.com/i12358679/655077cf0930f080.png)
ES配置好之后需要安装一个中分分词插件。
默认支持英文。
![](https://img.haomeiwen.com/i12358679/385d0d5203fad0e9.png)
安装路径是固定的:
![](https://img.haomeiwen.com/i12358679/71858e426530c753.png)
![](https://img.haomeiwen.com/i12358679/35f7bd22d920cdbc.png)
config目录下面是一些词典,这些词典提供了可以帮助进行分词,如果想扩展词典,可以使用下面1所指的位置。自定义新词和停止词。
![](https://img.haomeiwen.com/i12358679/a9e0c93814ee3e5c.png)
postman模拟web客户端提交数据给服务器。不用写很长的命令,比较方便。
-
接下来开始运行
双击elasticSearch.bat开始启动。
有这个提示的时候就说明可以了。
image.png
查看服务器集群的健康状况:
![](https://img.haomeiwen.com/i12358679/1bfc734b4bd5669c.png)
查看集群中有多少个节点:
?v表示带标题
![](https://img.haomeiwen.com/i12358679/f35c42816bbecc00.png)
查看索引:
![](https://img.haomeiwen.com/i12358679/e3bc5c4f5357f75e.png)
创建索引:
创建好的索引叫做test。
![](https://img.haomeiwen.com/i12358679/19d1bb5efabb6270.png)
再次查询,发现它的健康状况是
yellow,也就是不太健康,因为我们没有对其进行分片或者备份。
![](https://img.haomeiwen.com/i12358679/8f7c994109a31938.png)
删除索引,这里的DELETE是指http请求。
![](https://img.haomeiwen.com/i12358679/d6af488e3386bc4f.png)
再查一下,没了
![](https://img.haomeiwen.com/i12358679/ab44f617d9ca674d.png)
---- 使用postMan进行演示:
![](https://img.haomeiwen.com/i12358679/938c6ed3c9ca8149.png)
新建一个:
![](https://img.haomeiwen.com/i12358679/7a3d68a758d7ffaf.png)
删除:
![](https://img.haomeiwen.com/i12358679/af30d074672c9033.png)
它的目录索引会自动创建文件。
![](https://img.haomeiwen.com/i12358679/fc2eebd7157ff076.png)
查询这个索引之下id=1的数据:
![](https://img.haomeiwen.com/i12358679/1268d5da8f217efa.png)
如果修改数据,直接俄修改body,然后再次进行提交即可。
删除:
![](https://img.haomeiwen.com/i12358679/c36d394d0857c807.png)
找不到了,确实是删除了。
![](https://img.haomeiwen.com/i12358679/6309bdac68818ac4.png)
以上是如何将数据weihudaoes服务器中,但是重点是在于如何进行查询。
存入词条:
![](https://img.haomeiwen.com/i12358679/20613a015bd34ea0.png)
第二条:
![](https://img.haomeiwen.com/i12358679/dceb63dd6fcf9be2.png)
第三条:
![](https://img.haomeiwen.com/i12358679/db26eaf516f4a4ff.png)
检查一下是不是真的存进去了。
![](https://img.haomeiwen.com/i12358679/a5882b439cf20fd6.png)
查询,会查询到三条数据。
![](https://img.haomeiwen.com/i12358679/e2ee92ad0f96fcf5.png)
![](https://img.haomeiwen.com/i12358679/c357e602ca392ac4.png)
查询content中带有运营实习的词条。
![](https://img.haomeiwen.com/i12358679/fa682c7335cb6ebd.png)
运营实习并没有完全匹配,但是首先会进行分词匹配。
![](https://img.haomeiwen.com/i12358679/5a9784e50cfe8cd4.png)
查询的比较多:
![](https://img.haomeiwen.com/i12358679/7f173ae60dac8ea8.png)
结果查询到了三条。
6.4 spring整合ES
![](https://img.haomeiwen.com/i12358679/3fc74b9f7ee74af5.png)
我们将数据库中的帖子放在ES服务器中,然后对帖子进行搜索。
导包:
![](https://img.haomeiwen.com/i12358679/b1cf7ff49a2a7f9c.png)
我们可以将版本删除掉
配置:
9200是http进行访问的端口。
9300是tcp端口
但是,Redis和ES在底层都依赖于Netty,他们对Netty的启动是有冲突的,需要解决一下。
![](https://img.haomeiwen.com/i12358679/4b4818cdc9f15d6d.png)
![](https://img.haomeiwen.com/i12358679/df83e65676419d57.png)
![](https://img.haomeiwen.com/i12358679/f364cf51224bf699.png)
![](https://img.haomeiwen.com/i12358679/b67933be2e54d524.png)
接下来要做的事情,将数据库中的全部帖子存到ES服务器中,然后对服务器进行帖子的搜索。
Repository比较简单,先使用这个,如果不能满足需求,我们再考虑使用其他的。
首先需要进行配置,说明一下实体存储在ES服务器的哪个位置。
spring整合的ES会在访问ES服务器的时候自动将实体数据和ES服务器里面的索引进行映射。一个实体映射到哪个索引,类型,分片和副本,都是通过注解进行设置的,如下所示:
![](https://img.haomeiwen.com/i12358679/2a673f4dc5363ac0.png)
如果没有,会自动创建。
随便配置:
![](https://img.haomeiwen.com/i12358679/11325bb3609c0425.png)
a和b是两个分词器的名称:这是给词条加上注解。
![](https://img.haomeiwen.com/i12358679/885a4fc155f9460a.png)
存储数据的时候采用的是细粒度的分词器,但是搜索的时候使用的粗粒度的分词器。
对于可以被搜搜索的字段都采用这样的方式就可以。
![](https://img.haomeiwen.com/i12358679/c545edda9d4f48aa.png)
![](https://img.haomeiwen.com/i12358679/0ca40afa4e5aba0e.png)
实体类配置完成,有了这个配置,spring底层才能帮助我们生成具体的实现类。
--- 接下来定义repository接口
单独建立一个子包。
![](https://img.haomeiwen.com/i12358679/1628a1de2e4feebd.png)
这些接口里相当于是数据访问层的代码,下图中a表示我们要处理的实体类,B表示实体类中的主键。
![](https://img.haomeiwen.com/i12358679/d20abb18ed016108.png)
这样之后就可以直接使用了。艾玛
-
测试
先查看当前服务器中有多少个索引:有一个
image.png
目前并没有discussPost,一会儿看看执行了这个方法之后会不会有discussPOsit这个索引。
插入数据:
![](https://img.haomeiwen.com/i12358679/d38134c71233ecf8.png)
不用特意创建索引,如果发现没有,它会自动创建。
再次查询会发现有两个。
![](https://img.haomeiwen.com/i12358679/d3274638f930af34.png)
查询到了三条数据:
![](https://img.haomeiwen.com/i12358679/19dcbcc81b2ec801.png)
---- 插入多条数据
![](https://img.haomeiwen.com/i12358679/cd792dcf5f3da895.png)
-
修改数据
关注于id= 231的这条数据
image.png
修改其实就是覆盖
image.png
-
删除:
一条数据
image.png
多条数据
删除索引里面的全部数据
![](https://img.haomeiwen.com/i12358679/e2ee6f5b57cf8704.png)
-
搜索
构造搜索条件,返回结果设置等都可以进行设置。
ES能对匹配到的词前后加上标签。我们只需要给标签加上css样式。
关键词
排序方式
分页
高亮等一系列设置;
NativeSearchQueryBuilder能够构建一个NativeSearchQuery,也就是接口的实现类。【建造者模式】
withQuery是用来构建搜索条件的。里面需要另一个对象。里面设置搜索词条以及搜索字段。
然后是排序条件:
不可能将所有的结果都进行展示,因此还得设置分页条件
image.png
![](https://img.haomeiwen.com/i12358679/e48f7593ad6717c6.png)
![](https://img.haomeiwen.com/i12358679/9fc8643c91409659.png)
ES的结果是两部分,原始匹配的结果,还有高亮部分。需要将高亮数据整合到原始数据中。
![](https://img.haomeiwen.com/i12358679/541ee8f456924ecc.png)
需要利用这个Mapper进行处理。
解决办法,直接利用template的方法:
这是新的方法
![](https://img.haomeiwen.com/i12358679/dcb3e2afffe08822.png)
接下来就是将命中的数据hit保存到实体中。
SearchHit是一个map,是将json数据封装成为了map。
我们先获得原始的内容进行赋值,然后再使用高亮的内容进行覆盖。这样比较合理。
![](https://img.haomeiwen.com/i12358679/e6149656b6d5f957.png)
ES存日期的时候将其转换成为了long类型的字符串。
![](https://img.haomeiwen.com/i12358679/6ef5abbe7e0cbf3f.png)
![](https://img.haomeiwen.com/i12358679/97de48550d1bc333.png)
这也忒麻烦了
![](https://img.haomeiwen.com/i12358679/a169f1c0c527f855.png)
![](https://img.haomeiwen.com/i12358679/00e9d7a9bd8861c8.png)
返回的内容是局部。
6.6 开发社区搜索功能
![](https://img.haomeiwen.com/i12358679/5a90830fbdccaf40.png)
功能须知:发帖即存贴,删帖也删除服务器中的内容。
增加评论的时候,帖子的评论数量会增加。
![](https://img.haomeiwen.com/i12358679/591a9c3ca603293e.png)
这里的异步是指使用消息队列的方式。
要加上主键,主键才会被加入到这个实体类中。
![](https://img.haomeiwen.com/i12358679/49ad25c4f113796d.png)
![](https://img.haomeiwen.com/i12358679/4c43d5a220acf472.png)
![](https://img.haomeiwen.com/i12358679/3df2e28da6020c43.png)
注意了,这里的current是指从0开始。
![](https://img.haomeiwen.com/i12358679/5b385f0b8dd7f77f.png)
![](https://img.haomeiwen.com/i12358679/fccaaec9f6d8b580.png)
这个地儿老师说的不对吧,他说这里的entityUserId获取比较复杂,我觉得一点也不啊,不就是帖子的作者也就是自己吗??
![](https://img.haomeiwen.com/i12358679/a61cf797305e9e95.png)
![](https://img.haomeiwen.com/i12358679/45b0a45e6c107108.png)
当我们添加了评论的时候,帖子的评论数量也会增加,因此需要重新进行存储。只有对帖子的评论才会进行存储。
![](https://img.haomeiwen.com/i12358679/861d00ee40b0b08e.png)
现在事件已经被触发了,我们接下来要找到事件的消费者。
![](https://img.haomeiwen.com/i12358679/dfc94e8fb33541e9.png)
接下来是进行内容的展现。
为啥这里不能使用Post请求??
get请求得到参数有两种方法
- 使用路径中的某一级
- 使用路径中拼上?
![](https://img.haomeiwen.com/i12358679/6b91f9603c4cd075.png)
聚合数据:
注意其声明list和Map的位置。
![](https://img.haomeiwen.com/i12358679/4fc2a6c824e1f9d3.png)
图中的1是为了在页面上显示出来搜索的关键字,2是严谨。
![](https://img.haomeiwen.com/i12358679/04065696d4e500dc.png)
---- 最后是html的处理
文本框的值需要提交给后台,所以得加上name属性。
index的设置:
![](https://img.haomeiwen.com/i12358679/94cda1bcf7cc8502.png)
search.html的处理:
![](https://img.haomeiwen.com/i12358679/cf304c4ee2e81cb8.png)
![](https://img.haomeiwen.com/i12358679/a8f88a20588ed7ce.png)
启动服务之前,确保kafka和es是已经启动了的,kafka依赖于zookeeper(一个管理集群的工具)。
没有登陆的时候也可以利用其进行搜索。
![](https://img.haomeiwen.com/i12358679/a3aaccce62bad779.png)
接着,发布帖子,看看能不能立刻检索到
![](https://img.haomeiwen.com/i12358679/25a30970ff668423.png)
补上一个内联样式:
不然查到的结果头像非常大。
![](https://img.haomeiwen.com/i12358679/bb80f8c7b5e9955d.png)
![](https://img.haomeiwen.com/i12358679/afcb14807b0502a0.png)
一些小问题:
-
搜索框可以是post吗??
-
为什么有时候使用异步请求,什么可以使用,什么不可以使用,标准是啥。
-
像下面这里的写法,我觉得直接进行存储不就完事儿了呗,谁谁执行就存谁的,为啥要把这个过程分成两个,系统通知那个还可以理解,因为主题比较多,可以进行扩展。
image.png
-
这是直接通过路径得到的,可以直接得到,只要名字是一样的。
image.png
-
图片.png
这里一定要写成utext,我之前写的text一直于出现了很多 这种形式,而且<em>也没有转成对应的样式。