大家好,我是鱼皮,今天搞一场技术实战,需求分析 => 技术选型 => 设计实现,从 0 到 1,带大家优化网站搜索的灵活性。
本文大纲:
鱼皮 - 网站搜索优化
我开发的 编程导航网站 已经上线 6 个月了,但是从上线之初,网站一直存在一个很严重的问题,就是搜索功能并不好用。
此前,为了追求快速上线,搜索功能就简单地使用了数据库模糊查询(包含)来实现,开发是方便了,但这种方式很不灵活。
举个例子,网站上有个资源叫 “Java 设计模式”,而用户搜索 “Java设计模式” 就啥都搜不出来,原因是资源名中包含了空格,而用户搜索时输入的关键词并不包含空格。
空格只是一种特例,类似的情况还有很多,比如网站上有个资源叫 “Java 并发编程实战”,但用户搜索 “Java 实战” 时,明明前者包含 “Java” 和 “实战” 这两个词,但却是什么都搜不出来的。
要知道,搜索功能对于一个信息聚合类站点是至关重要的,直接影响用户的体验。在你的网站上搜不到资源,谁还会用?
所以我也收到了一些小伙伴的礼貌建议,比如这位秃头 Tom:
之前没有优化搜索,主要是两个原因:穷 + 怕麻烦。但随着网站用户量的增大,是时候填坑了!
想要提高网站搜索灵活性,可以使用 全文搜索 技术,在前端和后端都可以实现。
有时,我们要检索的数据是有限的,且所有数据都是 存储在客户端 的。
比如个人博客网站,我们通常会把每篇文章作为一个文件存放在某目录下,而不是存在后台数据库中,这种情况下,不需要再从服务器上去请求动态数据,那么可以直接在前端搜索数据。
有一些现成的搜索库,比如 Lunrjs (GitHub 7k+ star),先添加要检索的内容:
然后搜索就可以了:
纯前端全文搜索的好处是无需后端、简单方便,可以节省服务器的压力;无需连网,也没有额外的网络开销,检索更快速。
区别于前端,后端全文搜索在服务器上完成,从远程数据库中搜索符合要求的数据,再直接返回给前端。
目前主流的后端全文搜索技术是 Elasticsearch,一个分布式、RESTful 风格的搜索和数据分析引擎。
它的功能强大且灵活,但是需要自己搭建、定义数据、管理词典、上传和维护数据等,可 *** 作性很强,需要一些水平,新手和大佬设计出的 ES 搜索系统那是天差地别。
所以,对于不熟悉 Elasticsearch 的同学,也可以直接使用现成的全文检索服务。比如 Algolia,直接通过它提供的 API 上传需要检索的数据,再用它提供的 API 检索就行了。它提供了一定的免费空间,对于小型网站和学习使用完全足够了。
Algolia 检索服务
那么我的编程导航网站选择哪种实现方式呢?
首先,该网站的资源数是不固定的、无规律动态更新的,因此不适合前端全文检索。
其次,考虑到日后网站的数据量会比较大,而且可能要根据用户的搜索动态地去优化检索系统(比如自定义编程词典),因此考虑使用 Elasticsearch 技术 自行搭建搜索引擎,而不用现成的全文检索服务,这样今后自己想怎么定制系统都可以。此外,不用向其他平台发送网站数据,能保证数据的安全。
确定使用 Elasticsearch 后,要先搭建环境。
可以自己购买服务器,再按照官方文档一步步手动安装。对于有一定规模的个人网站来说,虽然搭建过程不难,但后期的维护成本却是巨大的,比如性能分析、监控、告警、安全等等,都需要自己来配置。尤其是后期网站数据量更大了,还要考虑搭建集群、水平扩容等等。
因此,我选择直接使用云服务商提供的 Elasticsearch 服务,这里选择腾讯云,自动为你搭建了现成的 ES 集群服务,还提供了可视化架构管理、集群监控、日志、高级插件、智能巡检等功能。
云 ES 集群架构图
虽然 ES 服务的价格贵,但节省下大量时间成本,对我来说是值得的。
我们的目标是优化网站资源的搜索功能,但接下来要做的不是直接编写具体的业务逻辑,而是先开发一个 公共的 ES 服务 。
其实对 ES 的 *** 作比较简单,可以先简单地把它理解为一个数据库,那么公共的 ES 服务应具有基本的增删改查功能,供其他函数调用。
由于编程导航的后端使用的是腾讯云开发技术,用 Nodejs 来编写服务,所以选用官方推荐的 @elastic/elasticsearch 库来 *** 作 ES。
代码很简单,先是建立和 ES 的连接,此处为了保证数据安全,使用内网地址:
然后是编写增删改查。这里做一步 抽象 ,通过 switch 等分支语句,根据请求参数来区分 *** 作、要 *** 作的数据等,这样就不用把每个 *** 作都独立写成一个接口了。
具体的增删改查代码就不赘述了,对着 ES Node 的官方文档看一遍就行了,后面会把代码开源到编程导航仓库中(>
分析
现在导致数据被删除的情况应该是a表和b表的主键id重复,es默认mysql中的 id 为主键 并且document 的_id 和id保持一致, 导致a表中的数据被删除掉了(替换掉了)
三、解决方案
新建一个字段保存数据库的id 主键数据, 查询的时候使用uuid作为id的数据
注意
es20以后就不支持修改_id映射为其他字段了,es也不支持联合主键之类的。
在谷歌应用商店中下载安装。
安装步骤:1打开谷歌应用商店。
2搜索elasticsearch-head。
3点击安装。
4安装成功→将localhost地址改为要指向的服务器及端口号。
5点击链接,可成功进入已部署成功的ES数据库中。
ES文件浏览器是一个能管理手机本地、局域网共享、FTP和蓝牙文件的阅读器。通过ES文件浏览器用户可以在本地、局域网共享、FTP和蓝牙设备中浏览、传输、复制、剪切、删除、重命名文件和文件夹等等,还可以备份系统的已装软件。
首先,你的表肯定是做了外键等约束的,所以删除,要从最外层删除。假设你的数据库是Sql Server的。
1、技能表
delete from 技能表 where 人物id in (select 人物id from 人物表 where 账号id in (select 账号id from 账号表 where datediff(day,上次登录时间lasttime,getdate())>=3))
2、装备属性表
delete from 装备属性表 where 装备id in (select 装备id from 装备表 where 人物id in (select 人物id from 人物表 where 账号id in (select 账号id from 账号表 where datediff(day,上次登录时间lasttime,getdate())>=3)))
3、装备表
delete from 装备表 where 人物id in (select 人物id from 人物表 where 账号id in (select 账号id from 账号表 where datediff(day,上次登录时间lasttime,getdate())>=3))
4、人物表
delete from 人物表 where 账号id in (select 账号id from 账号表 where datediff(day,上次登录时间lasttime,getdate())>=3)
5、账号表
delete from 账号表 where datediff(day,上次登录时间lasttime,getdate())>=3
用access建立一个数据库例子如下:
单击“开始”→”所有程序“→”Microsoft
Office“→”Microsoft
Access
2010“,打开Microsoft
Access
2010软件
在打开的Microsoft
Access
2010软件中选中“空数据库”双击即可创建。或者打击“创建”命令按钮创建,其中文件名处可以选择指定具体的文件名和路径。
创建空白数据库后可以看到一个新建了一个名为“表1”的数据表,界面右侧显示了它的字段。若要添加字段,可以单击“单击以添加”旁的倒三角箭头,选择要添加的字段类型。
此时光标会定位在字段名称上,可以对字段名称进行重命名,重命名字段名称后按下回车键,将继续下一个字段的添加 *** 作。
通过以上的步骤就可以创建一个包含单个数据表的简易的空白数据库了。
以上就是关于优化了破网站的搜索功能全部的内容,包括:优化了破网站的搜索功能、ES中高级检索(Query)、es导入数据,数据变少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)