项目笔记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就废弃掉了。
节点:一台服务器
分片:对索引进一步划分,拆分成多个空间存。提高并发能力,
副本:分片的备份。

  1. 下载elasticsearch需要查看自己项目依赖的paraent支持的es版本,我的是6.8.6。
  2. 配置elasticsearch.yml
cluster.name:nowcoder //集群名字
path.data:/work/data/elasticsearch-6.8.6/data       //数据存放位置
path.logs:/work/data/elasticsearch-6.8.6/logs
  1. 配置环境变量:/bin目录
  2. 装一个中文分词插件。github上找elasticsearch-analysis-ik项目下载对应es的版本
    新词配置:在IKAnalyzer.cfg.xml,配置新的新词内容,停止词:分词看到这个词,词条就停止了,基本不用配。
  3. 安装postman:模拟网页发送http请求
    提高使用体验用这个入门工具比较好
  4. 命令
    命令行访问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 //接口方式
  1. 配置文件
    clustername是之前修改过的名字
    9200 是http端口,9300是tcp端口


    image.png
  2. es,redis底层基于netty,二者在启用netty会出现冲突
    搜索NettyRuntime
    image.png

    如果现在直接启动就会报重复的错误,就会不启动了。是由于es调用导致的错误,在Netty4Util这个类是es底层封装的类,底层调用了setAvailableProcessors,这样底层就会报错,因为不为0,
    image.png

    这里是个开关,如果为false则不执行后面的代码也就不会报错。所以我们在启用之前要设置为false
    image.png
image.png
  1. 针对帖子操作,所以需要帖子实体类数据
    @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
  2. 定义Repository放到dao下的子包elasticsearch
    DiscussPostRepository继承ElasticsearchRepository
    前面是指定实体类,后面Integer是指定实体类的主键类型
    该接口就实现了增删改插的方法
  3. 定义测试类
    没有索引会自动创建
    save() 插入单条数据,如果原来有数据则会覆盖掉原来数据
    saveAll()插入多条数据
    deleteById()删除对应id的数据
    deleteAl()会把所有数据删了
    搜索功能
    把匹配到的关键词高亮,实际是把匹配内容加标签,我们在页面定义css,则可以高亮。
    把搜索的要求如分页等构造进去,我们需要SearchQuery
    type是置顶优先排序,然后是score,代表热度,最后是时间。按照这几个排序,然后指定分页规则,以及高亮方式。
    Page实现了Iterable接口所以可以直接foreach遍历出数据。
    image.png

    上面的search方法底层调用了elasticTemplate.queryForPage(searchQuery, class, SearchResultMapper)方法查的数据,class是实体,通过resultMapper返回,但是这个结果返回是原始数据,没有对高亮的数据封装。所以用elasticTemplate来做数据查询返回,并把高亮数据封装。
    最后得到的数据内容变少了,所以只会匹配一段内容,而不是所有内容。

开发社区搜索功能

image.png

1.创建ElasticsearchService

  1. discussPostController发帖子要设置消息通知,
    CommentController评论给帖子的时候再触发发帖事件。
    因为评论帖子要修改评论数量。
  2. 消费通知增加消费帖子发布事件。
  3. 新建SearchController
    5.处理页面

你可能感兴趣的:(项目笔记6-开发社区搜索功能)