优化了破网站的搜索功能

使用 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 的学习资料

跑了,留下 6T 的资源!

欢迎阅读 我从 0 自学进入腾讯的编程学习、求职、考证、写书经历,不再迷茫!

我学计算机的四年,共勉!

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
优化了破网站的搜索功能
大家好,我是鱼皮,今天搞一场技术实战,需求分析 => 技术选型 => 设计实现,从 0 到 1,带大家优化网站搜索的灵活性。
<<上一篇
下一篇>>