6.1 ES入门
image.png要使用ES进行搜索,数据需要在ES里面再存储一份。
可以将其是一种特殊的数据库。
索引,类型,文档,字段分别对应于数据库中的库,表,行,列。
一行数据一般采用json的格式,json里面的每一个属性是一个字段。
但是在ES6.0之后,一些概念发生了变化。一个索引表示一张表,类型逐渐被废弃。索引表示一张表,文档表示一行数据,字段表示一列数据。但是后面的内容还会用到类型概念,所以稍作提示。
和集群有关的概念:
多个服务器组合在一起叫做集群,其中的每一台叫做节点。分片是指将索引拆成多个分片进行存储。因为索引里面的内容可能会比较大,也就是表可能会比较大。拆分之后,有利于并发地进行操作。副本是对分片的备份,一个分片可能包括多个副本。
---- 查看文档
image.png
---下载产品
image.png
不下载最新的文件,因为springboot的pom.xml的父pom文件中规定的ES版本是6.4。
image.png下载的是ES6.4.3,然后修改配置
image.png image.png
集群的名字:
image.png image.png
往ES中存的数据存到了哪里:
image.png image.png
运行日志的存放地:
image.png image.png
--接着配置环境变量
image.png image.png
ES配置好之后需要安装一个中分分词插件。
默认支持英文。
image.png
安装路径是固定的:
image.png image.png
config目录下面是一些词典,这些词典提供了可以帮助进行分词,如果想扩展词典,可以使用下面1所指的位置。自定义新词和停止词。
image.png
postman模拟web客户端提交数据给服务器。不用写很长的命令,比较方便。
-
接下来开始运行
双击elasticSearch.bat开始启动。
有这个提示的时候就说明可以了。
image.png
查看服务器集群的健康状况:
image.png
查看集群中有多少个节点:
?v表示带标题
image.png
查看索引:
image.png
创建索引:
创建好的索引叫做test。
image.png
再次查询,发现它的健康状况是
yellow,也就是不太健康,因为我们没有对其进行分片或者备份。
删除索引,这里的DELETE是指http请求。
image.png
再查一下,没了
image.png
---- 使用postMan进行演示:
image.png新建一个:
image.png
删除:
image.png
它的目录索引会自动创建文件。
image.png
查询这个索引之下id=1的数据:
image.png
如果修改数据,直接俄修改body,然后再次进行提交即可。
删除:
image.png
找不到了,确实是删除了。
image.png
以上是如何将数据weihudaoes服务器中,但是重点是在于如何进行查询。
存入词条:
image.png
第二条:
image.png
第三条:
image.png
检查一下是不是真的存进去了。
image.png
查询,会查询到三条数据。
image.png image.png
查询content中带有运营实习的词条。
image.png
运营实习并没有完全匹配,但是首先会进行分词匹配。
image.png
查询的比较多:
image.png
结果查询到了三条。
6.4 spring整合ES
image.png我们将数据库中的帖子放在ES服务器中,然后对帖子进行搜索。
导包:
image.png
我们可以将版本删除掉
配置:
9200是http进行访问的端口。
9300是tcp端口
但是,Redis和ES在底层都依赖于Netty,他们对Netty的启动是有冲突的,需要解决一下。
image.png image.png image.png
image.png
接下来要做的事情,将数据库中的全部帖子存到ES服务器中,然后对服务器进行帖子的搜索。
Repository比较简单,先使用这个,如果不能满足需求,我们再考虑使用其他的。
首先需要进行配置,说明一下实体存储在ES服务器的哪个位置。
spring整合的ES会在访问ES服务器的时候自动将实体数据和ES服务器里面的索引进行映射。一个实体映射到哪个索引,类型,分片和副本,都是通过注解进行设置的,如下所示:
image.png
如果没有,会自动创建。
随便配置:
image.png
a和b是两个分词器的名称:这是给词条加上注解。
image.png
存储数据的时候采用的是细粒度的分词器,但是搜索的时候使用的粗粒度的分词器。
对于可以被搜搜索的字段都采用这样的方式就可以。
image.png image.png实体类配置完成,有了这个配置,spring底层才能帮助我们生成具体的实现类。
--- 接下来定义repository接口
单独建立一个子包。
image.png
这些接口里相当于是数据访问层的代码,下图中a表示我们要处理的实体类,B表示实体类中的主键。
image.png
这样之后就可以直接使用了。艾玛
-
测试
先查看当前服务器中有多少个索引:有一个
image.png
目前并没有discussPost,一会儿看看执行了这个方法之后会不会有discussPOsit这个索引。
插入数据:
image.png
不用特意创建索引,如果发现没有,它会自动创建。
再次查询会发现有两个。
image.png
查询到了三条数据:
image.png
---- 插入多条数据
image.png-
修改数据
关注于id= 231的这条数据
image.png
修改其实就是覆盖
image.png
-
删除:
一条数据
image.png
多条数据
删除索引里面的全部数据
image.png
-
搜索
构造搜索条件,返回结果设置等都可以进行设置。
ES能对匹配到的词前后加上标签。我们只需要给标签加上css样式。
关键词
排序方式
分页
高亮等一系列设置;
NativeSearchQueryBuilder能够构建一个NativeSearchQuery,也就是接口的实现类。【建造者模式】
withQuery是用来构建搜索条件的。里面需要另一个对象。里面设置搜索词条以及搜索字段。
然后是排序条件:
不可能将所有的结果都进行展示,因此还得设置分页条件
image.png
ES的结果是两部分,原始匹配的结果,还有高亮部分。需要将高亮数据整合到原始数据中。
image.png需要利用这个Mapper进行处理。
解决办法,直接利用template的方法:
这是新的方法
image.png
接下来就是将命中的数据hit保存到实体中。
SearchHit是一个map,是将json数据封装成为了map。
我们先获得原始的内容进行赋值,然后再使用高亮的内容进行覆盖。这样比较合理。
image.png
ES存日期的时候将其转换成为了long类型的字符串。
image.png image.png
这也忒麻烦了
image.png image.png
返回的内容是局部。
6.6 开发社区搜索功能
image.png功能须知:发帖即存贴,删帖也删除服务器中的内容。
增加评论的时候,帖子的评论数量会增加。
image.png
这里的异步是指使用消息队列的方式。
要加上主键,主键才会被加入到这个实体类中。
image.png image.png image.png
注意了,这里的current是指从0开始。
image.png image.png
这个地儿老师说的不对吧,他说这里的entityUserId获取比较复杂,我觉得一点也不啊,不就是帖子的作者也就是自己吗??
image.png image.png当我们添加了评论的时候,帖子的评论数量也会增加,因此需要重新进行存储。只有对帖子的评论才会进行存储。
image.png
现在事件已经被触发了,我们接下来要找到事件的消费者。
image.png接下来是进行内容的展现。
为啥这里不能使用Post请求??
get请求得到参数有两种方法
- 使用路径中的某一级
- 使用路径中拼上?
聚合数据:
注意其声明list和Map的位置。
图中的1是为了在页面上显示出来搜索的关键字,2是严谨。
image.png
---- 最后是html的处理
文本框的值需要提交给后台,所以得加上name属性。
index的设置:
image.png
search.html的处理:
image.png image.png
启动服务之前,确保kafka和es是已经启动了的,kafka依赖于zookeeper(一个管理集群的工具)。
没有登陆的时候也可以利用其进行搜索。
image.png
接着,发布帖子,看看能不能立刻检索到
image.png
补上一个内联样式:
不然查到的结果头像非常大。
image.png image.png
一些小问题:
-
搜索框可以是post吗??
-
为什么有时候使用异步请求,什么可以使用,什么不可以使用,标准是啥。
-
像下面这里的写法,我觉得直接进行存储不就完事儿了呗,谁谁执行就存谁的,为啥要把这个过程分成两个,系统通知那个还可以理解,因为主题比较多,可以进行扩展。
image.png -
这是直接通过路径得到的,可以直接得到,只要名字是一样的。
image.png -
图片.png
这里一定要写成utext,我之前写的text一直于出现了很多 这种形式,而且<em>也没有转成对应的样式。
网友评论