5.4 内容管理模块 - 课程搜索

5.4 内容管理模块 - 课程搜索

文章目录

  • 5.4 内容管理模块 - 课程搜索
  • 一、快速入门
    • 1.1 需求分析
    • 1.2 业务流程
    • 1.3 准备环境
      • 1.3.1 搭建 elasticsearch
      • 1.3.2 索引 概念
    • 1.4 课程信息索引同步
      • 1.4.1 技术方案

一、快速入门

本项目使用elasticsearch作为索引及搜索服务

课程如果发布之后,用户还不能搜索到,因为我们发布的课程还没有写入到索引库

1.1 需求分析

之前我们是直接查询数据库获取数据,但是现在我们要使用一种全文检索的技术来搜素我们的课程

什么是全文检索

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

传统的搜索方法是先找到文章,再从文章中找到要搜索的某个词

而全文检索的方式是先找词再找文章,如果想通过某个词来找到某个文章,那只能将这个词放在索引中

全文检索可以简单理解为通过索引搜索文章

这个过程类似于通过字典中的检索字表查字的过程

下面“索引”里面都是词,所以检索的时候就拿着“词”去搜索“索引”,通过索引再找到这个“词”关联的文章,这样的话比传统搜索方式效率要高

image-20240121201328004

1.2 业务流程

  • 第一步:创建索引

在课程发布操作执行后通过消息处理方式创建课程索引

image-20240121203334938

  • 第二步:搜索

当索引创建完成之后,用户可以在页面搜索对应的内容

image-20240121203426921

可以在搜索界面,通过课程分类、课程难度等级等条件进行搜索

image-20240121203501951

1.3 准备环境

1.3.1 搭建 elasticsearch

docker容器中安装了elasticsearch和kibana

kibana 是 ELK(Elasticsearch , Logstash, Kibana )之一,kibana 一款开源的数据分析和可视化平台,通过可视化界面访问elasticsearch的索引库,并可以生成一个数据报表

开发中主要使用kibana通过api对elasticsearch进行索引和搜索操作

通过浏览器访问 http://192.168.101.65:5601/app/dev_tools#/console进入kibana的开发工具界面

修改虚拟机中的启动脚本restart.sh

docker stop elasticsearch
docker stop kibanadocker start elasticsearch
docker start kibana

image-20240121204734375

启动脚本,访问kibana,浏览Elasticsearch索引

image-20240121210755538

1.3.2 索引 概念

索引相当于MySQL中的表

Elasticsearch与MySQL之间概念的对应关系见下表

image-20240121210050837

要使用elasticsearch需要建立索引

Mapping相当于表结构

Mapping创建后其字段不能删除,如果要删除需要删除整个索引

server.name: kibana

server.host:“0”

elasticsearch.hosts:[“http://192.168.101.65:9200”]

monitoring.ui.container.elasticsearch.enabled: true

1.4 课程信息索引同步

1.4.1 技术方案

通过向索引中添加课程信息最终实现了课程的搜索,我们发现课程信息是先保存在关系数据库中,而后再写入索引,这个过程是将关系数据中的数据同步到elasticsearch索引中的过程,可以简单成为索引同步。

通常项目中使用elasticsearch需要完成索引同步,索引同步的方法很多:

1、针对实时性非常高的场景需要满足数据的及时同步,可以同步调用,或使用Canal去实现。

1)同步调用即在向MySQL写数据后远程调用搜索服务的接口写入索引,此方法简单但是耦合代码太高。

2)可以使用一个中间的软件canal解决耦合性的问题,但存在学习与维护成本。

canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费,实现将MySQL的数据同步到消息队列、Elasticsearch、其它数据库等,应用场景十分丰富。

img

它的地址:

github地址:https://github.com/alibaba/canal

版本下载地址:https://github.com/alibaba/canal/releases

文档地址:https://github.com/alibaba/canal/wiki/Docker-QuickStart

Canal基于mysql的binlog技术实现数据同步,什么是binlog,它是一个文件,二进制格式,记录了对数据库更新的SQL语句,向数据库写数据的同时向binlog文件里记录对应的sql语句。当数据库服务器发生了故障就可以使用binlog文件对数据库进行恢复。

所以,使用canal是需要开启mysql的binlog写入功能,Canal工作原理如下:

img

1、canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump

协议

2、MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

3、canal 解析 binary log 对象(原始为 byte 流)

详细使用Canal进行索引同步的步骤参考:Canal实现索引同步.pdf

4、当索引同步的实时性要求不高时可用的技术比较多,比如:MQ、Logstash、任务调度等。

MQ:向mysql写数据的时候向mq写入消息,搜索服务监听MQ,收到消息后写入索引。使用MQ的优势是代码解耦,但是需要处理消息可靠性的问题有一定的技术成本,做到消息可靠性需要做到生产者投递成功、消息持久化以及消费者消费成功三个方面,另外还要做好消息幂等性问题。

Logstash: 开源实时日志分析平台 ELK包括Elasticsearch、Kibana、Logstash,Logstash负责收集、解析和转换日志信息,可以实现MySQL与Elasticsearch之间的数据同步。也可以实现解耦合并且是官方推荐,但需要增加学习与维护成本。

任务调度:向mysql写数据的时候记录修改记录,开启一个定时任务根据修改记录将数据同步到Elasticsearch。

根据本项目的需求,课程发布后信息同步的实时性要求不高,从提交审核到发布成功一般两个工作日完成。综合比较以上技术方案本项目的索引同步技术使用任务调度的方法。

如下图:

img

1、课程发布向消息表插入记录。

2、由任务调度程序通过消息处理SDK对消息记录进行处理。

3、向elasticsearch索引中保存课程信息。

如何向向elasticsearch索引中保存课程信息

执行流程如下:

由内容管理服务远程调用搜索服务添加课程信息索引,搜索服务再请求elasticsearch向课程索引中添加文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492790.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu内核卸载重装

目录 问题1.问题复现2.可以正常启动的方式 保存快照卸载有问题的内核重装最新内核参考资料 问题 1.问题复现 ubuntu开机出现如下画面,启动不能正常启动 2.可以正常启动的方式 使用其他内核可以正常工作 保存快照 在解决之前保存快照,防止破坏时恢复 卸载有问题的内核…

undo日志详解

一、undo日志介绍 上一节详细的说了redo日志,redo日志的功能就是把增删改操作都记录着,如果断电导致内存中的脏页丢失,可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性,undo日志设计出来是为…

win10编译openjdk源码

上篇文章作者在ubuntu系统上实践完成openjdk源码的编译,但是平常使用更多的是window系统,ubuntu上编译出来JDK无法再windows上使用。所以作者又花费了很长时间在windows系统上完成openjdk源码的编译,陆续花费一个月的时间终于完成了编译。 本…

力扣--哈希表/滑动窗口/双指针3.无重复字符的最长子串

思路分析: 使用双指针 i 和 j 表示子串的起始位置和结束位置。遍历字符串 s,对于每个字符: 如果字符不在 hash 中,将其加入 hash,同时更新最长子串的长度 result。如果字符已经在 hash 中,说明有重复字符出…

医院LIS(全称Laboratory Information Management System)系统源码

目录 一、医院LIS系统概况 二、医院LIS系统建设必要性 三、为什么要使用LIS系统 四、技术框架 (1)总体框架 (2)技术细节 (3)LIS主要功能模块 五、LIS系统优势 (1)客户/用户…

【前沿热点视觉算法】-视觉识别的统一卷积和自我注意

计算机视觉算法分享。问题或建议,请文章私信或者文章末尾扫码加微信留言。 1 论文题目 视觉识别的统一卷积和自我注意 2 论文摘要 由于大量的局部冗余和复杂的全局依赖性,从图像和视频中学习区别表示是一项具有挑战性的任务。卷积神经网络&#xff08…

如何使用视频号下载提取器提取视频,推荐2种方法使用!

视频号下载提取视频号视频,推荐大家2个方法! 前者简单,后者较为复杂,不过都可以提取视频号视频,大家可根据实际情况来使用。 01 视频号下载工具提取器? 1:通过搜一搜的这款搜索引擎找到自己…

Python总结

python注释 单行注释用 # 多行注释用 或者"""" """" 2.在Python中,双引号("")和单引号()都可以用来表示字符串。它们的使用方式基本相同,但…

Linux内核网络

文章目录 前言网络协议栈图解功能 发送Linux内核网络数据包图解流程 接收Linux内核网络数据包图解流程 最后 前言 你好,我是醉墨居士,因为Linux内核涉及的内容极多,我们初学者如果一上来就开始深挖细节,很有可能会在Linux内核代码…

代码随想录01 移除元素

移除元素 1.暴力解法2.双指针法 1.暴力解法 暴力解法就是嵌套两次for循环,第一层for循环来寻找数组中的值等于val的, 第二层for循环是往前覆盖,将值等于val的删除. 2.双指针法 双指针法,分为快指针和慢指针 快指针的意义是新的数组中含有的值 慢指针的意义是新的数组中值所在的…

激光雷达反光板算法总结

1 高反特征提取 首先,从雷达原始数据,提取到高反点;根据雷达的规格书提供的不同材料的强度,设定合适的阈值;;更优的方法是根据距离设定不同的阈值 2 反光板及反光柱的聚类 根据高反点是否连续进行聚类,同时结合距离及雷达的角度分辨率,计算出针对不同尺寸的反光板或反…