美文网首页
项目笔记6-开发社区搜索功能

项目笔记6-开发社区搜索功能

作者: 脏脏包盛 | 来源:发表于2020-02-10 23:06 被阅读0次

    Elasticsearch入门

    Elasticsearch简介

    数据在在搜索引擎中存一份进行分词索引然后搜索
    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<DiscussPost, Integer>
      前面是指定实体类,后面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-开发社区搜索功能

          本文链接:https://www.haomeiwen.com/subject/vtznxhtx.html