1. Elasticsearch 入门

06-开发 Elasticsearch 相关功能 - 图1

ES 支持结构化数据,也支持非结构化数据。要让 ES 搜索数据,前提是数据需要在 ES 上存一份,从这个角度,可以把 ES 当成一种特殊的数据库。

索引:与 MySQL 中的数据库对应(6.0版本之后对应表)
类型:与 MySQL 中的表对应(6.0版本之后逐渐废弃)
文档:与 MySQL 中的一行数据对应
字段:与 MySQL 中的属性对应
分片:一个索引可以拆分成多个分片进行存储
副本:对分片的备份

使用 Elasticsearch-analysis-ik 进行中文分词。使用 PostMan 可以方便地对 ES 进行测试。

  1. Elasticsearch 查看健康状况:curl -X GET "localhost:9200/_cat/health?v"
  2. Elasticsearch 查看节点:curl -X GET "localhost:9200/_cat/nodes?v"
  3. Elasticsearch 查看索引:curl -X GET "localhost:9200/_cat/indices?v"
  4. Elasticsearch 创建索引:curl -X PUT "localhost:9200/test"
  5. Elasticsearch 删除索引:curl -X DELETE "localhost:9200/test"

2. Spring 整合 Elasticsearch

06-开发 Elasticsearch 相关功能 - 图2

  • Spring Data Elasticsearch:
    • ElasticsearchTemplate(集成了 ES 的 CRUD 方法)
    • ElasticsearchRepository(接口,底层依赖 ElasticsearchTemplate,使用接口更方便)
  • 9200 是 HTTP 访问的端口,9300 是 TCP 访问的端口。
  • Redis 和 ES 底层都用到了 Netty,有启动冲突,解决方法是在 CommunityApplication 类加入初始化方法进行配置。
  • 在实体类上加上注解,使 ES 和 MySQL 产生关联。
  • 在 DAO 层创建 DiscussPostRepository,继承 ElasticsearchRepository 即可。
  • 继承 ElasticsearchRepository<实体类, 实体类的主键类型>,搜索出来的结果是关键字附近的一小段内容。

    3. 开发社区搜索功能

    增加帖子发布事件,在帖子发布时,异步的将帖子同步到 Elasticsearch 服务器。开发搜索帖子的功能,并将搜索结果中的关键词做高亮显示。
    06-开发 Elasticsearch 相关功能 - 图3

    业务层逻辑

  • 新建 ElasticsearchService 类,定义CRUD和搜索方法

  • 将帖子保存到 Elasticsearch 服务器(saveDiscusspost)
    • 对帖子实体类DiscussPost用注解进行相关配置
    • 在 dao 层创建 DiscussPostRepository类,继承 ElasticsearchRepository 接口即可,它集成了 CRUD 方法
  • 从 Elasticsearch 服务器删除帖子(deleteDiscusspost)
  • 从 Elasticsearch 服务器搜索帖子(searchDiscusspost)

    • ES可以在搜索到的词加标签,达到高亮显示
    • 利用elasticTemplate.queryForPage()查询

      表现层逻辑

  • 发布帖子和增加评论时,都将帖子异步地提交到 Elasticsearch服务器

    • DiscussPostController 发帖和评论时,触发发帖事件到 Kafka
  • 在 Kafka 的消费组件 EventConsumer 上增加 handlelPublishMessage() 方法,消费帖子发布事件
    • 在 EventConsumer 类上增加消费发帖事件的方法
    • 在事件中调用逻辑层查询帖子,存到 ES 服务器
  • 创建 SearchController 控制器,用于处理搜索请求
    • 以问号的方式传入keyword(search?keyword=xxx)
    • 调用 elasticsearchService 搜索帖子
    • 然后将搜索的结果聚合成 VO 传给模版