ES+云开发搜索优化实战本文大纲:背景到1
优采云 发布时间: 2021-08-08 02:28ES+云开发搜索优化实战本文大纲:背景到1
使用ES+云开发优化实战网站搜
大家好,我是尤斯金。今天来进行一场技术实战。需求分析=>技术选择=>设计与实现,从0到1,让大家优化网站search的灵活性。
ES+云开发搜索优化实战
本文概要:
背景
我开发的编程导航网站已经上线6个月了,但是从上线开始,网站就一直存在一个严重的问题,那就是搜索功能不好用。
以前为了追求快速启动,搜索功能只是简单地使用数据库模糊查询(收录)来实现。开发方便,但是这种方法很不灵活。
比如网站上有一个资源叫“Java设计模式”,用户搜索“Java设计模式”却什么也找不到。原因是资源名称收录空格,用户搜索时输入关键词不收录空格。
空间只是一个特例。类似的情况还有很多。比如网站上有一个资源叫“Java并发编程实战”,但是当用户搜索“Java实战”时,很明显前者收录了“Java”和“实战”这两个词,但什么也找不到。
请注意,搜索功能对于信息聚合站点来说非常重要,它直接影响用户体验。如果你在网站上找不到资源,谁会使用它?
所以我也收到了一些朋友的礼貌建议,比如这个秃头汤姆:
之前搜索没有优化,主要有两个原因:差+怕麻烦。但是随着网站用户数量的增加,是时候补坑了!
技术选择
如果想提高网站search的灵活性,可以使用全文搜索技术,前后端都可以实现。
前端全文搜索
有时,我们要检索的数据有限,所有数据都存储在客户端。
比如个人博客网站,我们通常将每个文章作为一个文件存放在某个目录中,而不是存放在后台数据库中。在这种情况下,不需要从服务器请求动态数据。然后就可以直接在前端搜索数据了。
有一些现成的搜索库,比如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 进行检索。提供了一定的空闲空间,完全足够小网站和学习使用。
【外链图片传输失败,源站可能有反盗链机制,建议保存图片直接上传(img-vXPF94km-86)()】
选择
我的编程导航网站选择哪种实现方式?
首先,这个网站的资源数量不固定,不定期更新,不适合前端全文搜索。
其次,考虑到网站以后的数据量会比较大,检索系统(比如自定义编程字典)可能会根据用户的搜索动态优化,所以考虑使用Elasticsearch技术构建您自己的搜索引擎,并且您不需要现成的全文搜索服务,因此您可以在未来随心所欲地自定义系统。另外不需要将网站数据发送到其他平台,可以保证数据安全。
ES 安装
决定使用 Elasticsearch 后,首先要搭建环境。
您可以自己购买服务器,然后按照官方文档一步一步手动安装。对于有一定规模的个人网站,虽然设置过程不难,但后续的维护成本巨大,比如性能分析、监控、告警、安全等,都需要自己配置。特别是后期网站数据量会更大,还必须考虑集群、横向扩展等。
因此,我选择直接使用云服务商提供的Elasticsearch服务。在这里,我选择腾讯云为您自动搭建现成的ES集群服务。它还提供可视化架构管理、集群监控、日志、高级插件和智能巡更。检查等功能。
虽然 ES 服务价格昂贵,但为我节省大量时间和成本是值得的。
还有一个非常方便的定制搜索服务,Elastic App Search。有兴趣的可以试试。
ES 公共服务
我们的目标是优化网站resources的搜索功能,但接下来要做的不是直接写具体的业务逻辑,而是先开发一个公共的ES服务。
其实ES的操作还是比较简单的。您可以先将其简单地理解为数据库。那么公共ES服务应该具备基本的增删改查功能,供其他函数调用。
实现
由于编程导航后端使用腾讯云开发技术和Node.js编写服务,所以使用官方推荐的@elastic/elasticsearch库来操作ES。
如果你没有使用过云开发也没关系。您可以先将其理解为后端。欢迎阅读我之前的文章:了解云开发。
代码非常简单。首先,与ES建立连接。为保证数据安全,请使用内网地址:
const client = new Client({
// 内网地址
node: 'http://10.0.61.1:9200',
// 用户名和密码
auth: {
username: esConfig.username,
password: esConfig.password,
},
});
然后写增删改查。这是一个步骤抽象。通过switch等分支语句,根据请求参数区分要操作的操作和数据,这样每个操作就不需要单独写成接口了。
// 接受请求参数
const { op, index, id, params } = event;
// 根据操作执行增删改查
switch (op) {
case 'add':
return doAdd(index, id, params);
case 'delete':
return doDelete(index, id);
case 'search':
return doSearch(index, params);
case 'update':
return doUpdate(index, id, params);
}
在云开发中,如果一个函数没有被调用太久,资源就会被释放。下次请求时,会进行冷启动,重新创建资源,导致接口返回速度变慢。因此,将多个操作封装到同一个函数中也可以减少冷启动的机会。
具体的增删改查代码不再赘述。只需阅读 ES Node 的官方文档。稍后将代码开源到编程导航仓库()。
本地调试
写好代码后,可以使用Cloud Development自带的tcb命令行工具在本地执行函数。
记得先把ES的连接地址改成公网,然后输入一行命令。比如我们要在ES中插入一段数据,传入要执行的函数名、请求参数、代码路径:
<p>tcb fn run
--name
--params "{