优化了破网站的搜索功能
使用 ES + 云开发实战优化网站搜索
大家好,我是鱼皮,今天搞一场技术实战,需求分析 => 技术选型 => 设计实现,从 0 到 1,带大家优化网站搜索的灵活性。
ES + 云开发搜索优化实战
本文大纲:
之前没有优化搜索,主要是两个原因:穷 + 怕麻烦。但随着网站用户量的增大,是时候填坑了!
技术选型
想要提高网站搜索灵活性,可以使用 全文搜索 技术,在前端和后端都可以实现。
前端全文搜索
有时,我们要检索的数据是有限的,且所有数据都是 存储在客户端 的。
比如个人博客网站,我们通常会把每篇文章作为一个文件存放在某目录下,而不是存在后台数据库中,这种情况下,不需要再从服务器上去请求动态数据,那么可以直接在前端搜索数据。
有一些现成的搜索库,比如 Lunr.js
(GitHub 7k+ star),先添加要检索的内容:
var idx = lunr(function () {
this.field('title')
this.field('body')
// 内容
this.add({
"title": "yupi",
"body": "wx搜程序员鱼皮,阅读我的原创文章",
"id": "1"
})
})
然后搜索就可以了:
idx.search("鱼皮")
纯前端全文搜索的好处是无需后端、简单方便,可以节省服务器的压力;无需连网,也没有额外的网络开销,检索更快速。
后端全文搜索
区别于前端,后端全文搜索在服务器上完成,从远程数据库中搜索符合要求的数据,再直接返回给前端。
目前主流的后端全文搜索技术是 Elasticsearch,一个分布式、RESTful 风格的搜索和数据分析引擎。
它的功能强大且灵活,但是需要自己搭建、定义数据、管理词典、上传和维护数据等,可操作性很强,需要一些水平,新手和大佬设计出的 ES 搜索系统那是天差地别。
所以,对于不熟悉 Elasticsearch 的同学,也可以直接使用现成的全文检索服务。比如 Algolia,直接通过它提供的 API 上传需要检索的数据,再用它提供的 API 检索就行了。它提供了一定的免费空间,对于小型网站和学习使用完全足够了。
ES 安装
确定使用 Elasticsearch 后,要先搭建环境。
可以自己购买服务器,再按照官方文档一步步手动安装。对于有一定规模的个人网站来说,虽然搭建过程不难,但后期的维护成本却是巨大的,比如性能分析、监控、告警、安全等等,都需要自己来配置。尤其是后期网站数据量更大了,还要考虑搭建集群、水平扩容等等。
因此,我选择直接使用云服务商提供的 Elasticsearch 服务,这里选择腾讯云,自动为你搭建了现成的 ES 集群服务,还提供了可视化架构管理、集群监控、日志、高级插件、智能巡检等功能。
远程测试
本地测试好公共服务代码后,把 ES 连接地址改成内网 IP,然后发布到云端。
接下来试着编写一个其他的函数来访问公共 ES 服务,比如插入资源到 ES,通过 callFunction
请求:
// 添加资源到 ES
function addData() {
// 请求公共服务
app.callFunction({
name: 'esService',
data: {
op: 'add',
index: 'resource',
id,
params: data,
}
});
}
但是,数据并没有被成功插入,而是返回了接口超时,Why?
内网配置
通过日志得知是 ES 连接不上,会不会是因为发布上线的 ES 公共服务所在的机器和 ES 不在同一个内网呢?
所以需要在云开发控制台更改 ES 公共服务的私有网络配置,选择和购买 ES 时同样的子网就行了:
那有没有对现有代码 侵入更小 的方法呢?
定时同步
如果对数据实时性的要求不高,可以选择定时同步,每隔一段时间将最新插入或修改的数据从数据库复制到 ES 上。
实现方式有很多种,比如用 Logstash
数据传输管道,或者自己编写定时任务程序,这样就完全不用改现有的代码。
实时同步
如果对数据实时性要求很高,刚刚插入数据库的数据就要能立刻就能被搜索到,那么就要实时同步。除了双写外,还可以监听数据库的 binlog,在数据库发生任何变更时,我们都能感知到。
阿里有个开源项目叫 Canal
,能够实时监听 MySQL 数据库,并推送通知给下游,感兴趣的朋友可以看看。
ES 是怎么实现灵活搜索的呢?欢迎阅读 这篇文章 。
新 ES 搜索接口的发布并不意味着老的数据库查询接口淘汰,可以同时保留。按名称搜索资源时用新接口,更灵活;而根据审核状态、搜索某用户发布过的资源时,可以用老接口,从数据库查。从而分摊负载,职责分离,让对的技术做对的事情!
以上就是本期分享,有帮助的话点个赞吧 ❤️
我是鱼皮,最后再送大家一些 帮助我拿到大厂 offer 的学习资料:
欢迎阅读 我从 0 自学进入腾讯的编程学习、求职、考证、写书经历,不再迷茫!