1. Elasticsearch 入门
ES 支持结构化数据,也支持非结构化数据。要让 ES 搜索数据,前提是数据需要在 ES 上存一份,从这个角度,可以把 ES 当成一种特殊的数据库。
索引:与 MySQL 中的数据库对应(6.0版本之后对应表)
类型:与 MySQL 中的表对应(6.0版本之后逐渐废弃)
文档:与 MySQL 中的一行数据对应
字段:与 MySQL 中的属性对应
分片:一个索引可以拆分成多个分片进行存储
副本:对分片的备份
使用 Elasticsearch-analysis-ik 进行中文分词。使用 PostMan 可以方便地对 ES 进行测试。
Elasticsearch 查看健康状况:curl -X GET "localhost:9200/_cat/health?v"
Elasticsearch 查看节点:curl -X GET "localhost:9200/_cat/nodes?v"
Elasticsearch 查看索引:curl -X GET "localhost:9200/_cat/indices?v"
Elasticsearch 创建索引:curl -X PUT "localhost:9200/test"
Elasticsearch 删除索引:curl -X DELETE "localhost:9200/test"
2. Spring 整合 Elasticsearch
- Spring Data Elasticsearch:
- ElasticsearchTemplate(集成了 ES 的 CRUD 方法)
- ElasticsearchRepository(接口,底层依赖 ElasticsearchTemplate,使用接口更方便)
- 9200 是 HTTP 访问的端口,9300 是 TCP 访问的端口。
- Redis 和 ES 底层都用到了 Netty,有启动冲突,解决方法是在 CommunityApplication 类加入初始化方法进行配置。
- 在实体类上加上注解,使 ES 和 MySQL 产生关联。
- 在 DAO 层创建 DiscussPostRepository,继承 ElasticsearchRepository 即可。
继承 ElasticsearchRepository<实体类, 实体类的主键类型>,搜索出来的结果是关键字附近的一小段内容。
3. 开发社区搜索功能
增加帖子发布事件,在帖子发布时,异步的将帖子同步到 Elasticsearch 服务器。开发搜索帖子的功能,并将搜索结果中的关键词做高亮显示。
业务层逻辑
新建 ElasticsearchService 类,定义CRUD和搜索方法
- 将帖子保存到 Elasticsearch 服务器(saveDiscusspost)
- 对帖子实体类DiscussPost用注解进行相关配置
- 在 dao 层创建 DiscussPostRepository类,继承 ElasticsearchRepository 接口即可,它集成了 CRUD 方法
- 从 Elasticsearch 服务器删除帖子(deleteDiscusspost)
从 Elasticsearch 服务器搜索帖子(searchDiscusspost)
发布帖子和增加评论时,都将帖子异步地提交到 Elasticsearch服务器
- DiscussPostController 发帖和评论时,触发发帖事件到 Kafka
- 在 Kafka 的消费组件 EventConsumer 上增加 handlelPublishMessage() 方法,消费帖子发布事件
- 在 EventConsumer 类上增加消费发帖事件的方法
- 在事件中调用逻辑层查询帖子,存到 ES 服务器
- 创建 SearchController 控制器,用于处理搜索请求
- 以问号的方式传入keyword(search?keyword=xxx)
- 调用 elasticsearchService 搜索帖子
- 然后将搜索的结果聚合成 VO 传给模版