项目笔记6-开发社区搜索功能
Elasticsearch入门
Elasticsearch简介
- 一个分布式的、Restful风格的搜索引擎。
支持对各种类型的数据的检索。
搜索速度快,可以提供实时的搜索服务。
便于水平扩展,每秒可以处理PB级海量数据。 - Elasticsearch术语
索引、类型、文档、字段。
集群、节点、分片、副本。
https://www.elastic.co
https://www.getpostman.com
镜像连接
https://thans.cn/mirror/elasticsearch.html
数据在在搜索引擎中存一份进行分词索引然后搜索
es在提交和分词都很快。目前最流行的搜索引擎
术语:
索引:相当于mysql的database
类型:相当于mysql表*/85
文档:相当于mysql一行数据,通常是json
字段:json的每个属性就是字段,相当于mysql的列
es6.0以后发生变化想要废弃类型这个概念。6.0以后索引对应一张表。保留了类型但是固定成一个单词,7.0就废弃掉了。
节点:一台服务器
分片:对索引进一步划分,拆分成多个空间存。提高并发能力,
副本:分片的备份。
- 下载elasticsearch需要查看自己项目依赖的paraent支持的es版本,我的是6.8.6。
- 配置elasticsearch.yml
cluster.name:nowcoder //集群名字
path.data:/work/data/elasticsearch-6.8.6/data //数据存放位置
path.logs:/work/data/elasticsearch-6.8.6/logs
- 配置环境变量:/bin目录
- 装一个中文分词插件。github上找
elasticsearch-analysis-ik
项目下载对应es的版本
新词配置:在IKAnalyzer.cfg.xml,配置新的新词内容,停止词:分词看到这个词,词条就停止了,基本不用配。 - 安装postman:模拟网页发送http请求
提高使用体验用这个入门工具比较好 - 命令
命令行访问es,默认占用9200端口
./elasticsearch.sh
查看集群健康状况 v表示显示标题
crl -X GET "localhost:9200/_cat/health?v"
image.png
green就是健康
查看集群节点
cur -X GET "localhost:9200/_cat/nodes?v"
堆内存占用量,cpu占用量,节点角色等等
image.png
cur _X PUT "localhost:9200/test" //创建索引
cur -X GET "localhost:9200/_cat/indices?v"
创建的索引是yellow表示不是健康的状态,应为没有创建分片,副本啥的,
image.png
删除节点
cur _X DELETE "localhost:9200/_cat/indices?v" //删除
再次查询则无节点
使用postman
一样可以执行上面的命令,
插入数据,用put请求,指定不存在的索引会自动创建,6.0 _doc就是占个位置,没有实际作用, 后面是id
localhost:9200/test/_doc/1
putgetdelete es的索引 数据
搜索数据
image.png
image.png
能够对你提供的搜索条件分词。搜索出来的内容包括实习和运营
复杂搜索条件通过请求体实现
image.png
复杂的从手册里看
Spring整合es
- 引入依赖
spring-boot-starter-data-elasticsearch - 配置Elasticsearch
cluster-name、cluster-nodes 集群名字和节点 - Spring Data Elasticsearch
ElasticsearchTemplate //模板方式
ElasticsearchRepository //接口方式
-
配置文件
clustername是之前修改过的名字
9200 是http端口,9300是tcp端口
image.png - es,redis底层基于netty,二者在启用netty会出现冲突
搜索NettyRuntime
image.png
如果现在直接启动就会报重复的错误,就会不启动了。是由于es调用导致的错误,在Netty4Util
这个类是es底层封装的类,底层调用了setAvailableProcessors
,这样底层就会报错,因为不为0,
image.png
这里是个开关,如果为false则不执行后面的代码也就不会报错。所以我们在启用之前要设置为false
image.png
-
针对帖子操作,所以需要帖子实体类数据
@Document
indexName:索引名字
type:类型,写成固定的_doc
shards:分片 6
replicas: 副本 3
通过这把实体映射。副本分片等都在这配置
@Id:存到id字段中
@Field 普通字段, type=FieldType.Integer
analyzer="ik_max_word" 存储时解析器,要用详细的分析器,拆解完全,在config中找这个配置器,searchAnalyzer="ik_smart"搜索时解析器。搜索时没必要用这样复杂的分析器,拆分较少词汇,满足需求。用聪明的方式猜出意图搜索。
下面示例,如果需要用来搜索的需要指定存储解析器和搜索解析器。
image.png
这是后续的内容
image.png - 定义Repository放到dao下的子包elasticsearch
DiscussPostRepository继承ElasticsearchRepository<DiscussPost, Integer>
前面是指定实体类,后面Integer是指定实体类的主键类型
该接口就实现了增删改插的方法 - 定义测试类
没有索引会自动创建
save() 插入单条数据,如果原来有数据则会覆盖掉原来数据
saveAll()插入多条数据
deleteById()删除对应id的数据
deleteAl()会把所有数据删了
搜索功能
把匹配到的关键词高亮,实际是把匹配内容加标签,我们在页面定义css,则可以高亮。
把搜索的要求如分页等构造进去,我们需要SearchQuery
类
type是置顶优先排序,然后是score,代表热度,最后是时间。按照这几个排序,然后指定分页规则,以及高亮方式。
Page实现了Iterable接口所以可以直接foreach遍历出数据。
image.png
上面的search方法底层调用了elasticTemplate.queryForPage(searchQuery, class, SearchResultMapper)
方法查的数据,class是实体,通过resultMapper返回,但是这个结果返回是原始数据,没有对高亮的数据封装。所以用elasticTemplate来做数据查询返回,并把高亮数据封装。
最后得到的数据内容变少了,所以只会匹配一段内容,而不是所有内容。
开发社区搜索功能
image.png1.创建ElasticsearchService
- discussPostController发帖子要设置消息通知,
CommentController评论给帖子的时候再触发发帖事件。
因为评论帖子要修改评论数量。 - 消费通知增加消费帖子发布事件。
- 新建SearchController
5.处理页面