网站优化

首页 » 常识 » 常识 » 优化了破网站的搜索功能
TUhjnbcbe - 2024/4/3 8:39:00
白癜风医药 https://disease.39.net/bjzkbdfyy/210704/9141958.html

使用ES+云开发实战优化网站搜索

大家好,我是鱼皮,今天搞一场技术实战,需求分析=技术选型=设计实现,从0到1,带大家优化网站搜索的灵活性。

ES+云开发搜索优化实战

本文大纲:

鱼皮-网站搜索优化

背景

我开发的编程导航网站已经上线6个月了,但是从上线之初,网站一直存在一个很严重的问题,就是搜索功能并不好用。

此前,为了追求快速上线,搜索功能就简单地使用了数据库模糊查询(包含)来实现,开发是方便了,但这种方式很不灵活。

举个例子,网站上有个资源叫“Java设计模式”,而用户搜索“Java设计模式”就啥都搜不出来,原因是资源名中包含了空格,而用户搜索时输入的关键词并不包含空格。

空格只是一种特例,类似的情况还有很多,比如网站上有个资源叫“Java并发编程实战”,但用户搜索“Java实战”时,明明前者包含“Java”和“实战”这两个词,但却是什么都搜不出来的。

要知道,搜索功能对于一个信息聚合类站点是至关重要的,直接影响用户的体验。在你的网站上搜不到资源,谁还会用?

所以我也收到了一些小伙伴的礼貌建议,比如这位秃头Tom:

之前没有优化搜索,主要是两个原因:穷+怕麻烦。但随着网站用户量的增大,是时候填坑了!

技术选型

想要提高网站搜索灵活性,可以使用全文搜索技术,在前端和后端都可以实现。

前端全文搜索

有时,我们要检索的数据是有限的,且所有数据都是存储在客户端的。

比如个人博客网站,我们通常会把每篇文章作为一个文件存放在某目录下,而不是存在后台数据库中,这种情况下,不需要再从服务器上去请求动态数据,那么可以直接在前端搜索数据。

有一些现成的搜索库,比如Lunr.js(GitHub7k+star),先添加要检索的内容:

varidx=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检索就行了。它提供了一定的免费空间,对于小型网站和学习使用完全足够了。

Algolia检索服务

选择

那么我的编程导航网站选择哪种实现方式呢?

首先,该网站的资源数是不固定的、无规律动态更新的,因此不适合前端全文检索。

其次,考虑到日后网站的数据量会比较大,而且可能要根据用户的搜索动态地去优化检索系统(比如自定义编程词典),因此考虑使用Elasticsearch技术自行搭建搜索引擎,而不用现成的全文检索服务,这样今后自己想怎么定制系统都可以。此外,不用向其他平台发送网站数据,能保证数据的安全。

ES安装

确定使用Elasticsearch后,要先搭建环境。

可以自己购买服务器,再按照官方文档一步步手动安装。对于有一定规模的个人网站来说,虽然搭建过程不难,但后期的维护成本却是巨大的,比如性能分析、监控、告警、安全等等,都需要自己来配置。尤其是后期网站数据量更大了,还要考虑搭建集群、水平扩容等等。

因此,我选择直接使用云服务商提供的Elasticsearch服务,这里选择腾讯云,自动为你搭建了现成的ES集群服务,还提供了可视化架构管理、集群监控、日志、高级插件、智能巡检等功能。

云ES集群架构图

虽然ES服务的价格贵,但节省下大量时间成本,对我来说是值得的。

还有个很方便的定制化搜索服务ElasticAppSearch,大家感兴趣可以试试。

ES公共服务

我们的目标是优化网站资源的搜索功能,但接下来要做的不是直接编写具体的业务逻辑,而是先开发一个公共的ES服务。

其实对ES的操作比较简单,可以先简单地把它理解为一个数据库,那么公共的ES服务应具有基本的增删改查功能,供其他函数调用。

实现

由于编程导航的后端使用的是腾讯云开发技术,用Node.js来编写服务,所以选用官方推荐的

elastic/elasticsearch库来操作ES。

没用过云开发也没事,可以先把它理解为一个后端,欢迎阅读我之前的文章:了解云开发。

代码很简单,先是建立和ES的连接,此处为了保证数据安全,使用内网

1
查看完整版本: 优化了破网站的搜索功能