优化了破网站的搜索功能

作者&投稿:秋峡 (若有异议请与网页底部的电邮联系)
~

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

本文大纲:

鱼皮 - 网站搜索优化

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

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

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

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

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

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

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

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

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

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

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

然后搜索就可以了:

纯前端全文搜索的好处是无需后端、简单方便,可以节省服务器的压力;无需连网,也没有额外的网络开销,检索更快速。

区别于前端,后端全文搜索在服务器上完成,从远程数据库中搜索符合要求的数据,再直接返回给前端。

目前主流的后端全文搜索技术是 Elasticsearch,一个分布式、RESTful 风格的搜索和数据分析引擎。

它的功能强大且灵活,但是需要自己搭建、定义数据、管理词典、上传和维护数据等,可操作性很强,需要一些水平,新手和大佬设计出的 ES 搜索系统那是天差地别。

所以,对于不熟悉 Elasticsearch 的同学,也可以直接使用现成的全文检索服务。比如 Algolia,直接通过它提供的 API 上传需要检索的数据,再用它提供的 API 检索就行了。它提供了一定的免费空间,对于小型网站和学习使用完全足够了。

Algolia 检索服务

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

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

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

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

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

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

云 ES 集群架构图

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

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

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

由于编程导航的后端使用的是腾讯云开发技术,用 Node.js 来编写服务,所以选用官方推荐的 @elastic/elasticsearch 库来操作 ES。

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

然后是编写增删改查。这里做一步 抽象 ,通过 switch 等分支语句,根据请求参数来区分操作、要操作的数据等,这样就不用把每个操作都独立写成一个接口了。

具体的增删改查代码就不赘述了,对着 ES Node 的官方文档看一遍就行了,后面会把代码开源到编程导航仓库中(https://github.com/liyupi/code-nav)。

编写好代码后,可以用云开发自带的 tcb 命令行工具在本地执行该函数。

记得先把 ES 的连接地址改成公网,然后输入一行命令就行了。比如我们要向 ES 插入一条数据,传入要执行的函数名、请求参数、代码路径:

执行成功后,就能在 ES 中看到新插入的数据了(通过 Kibana 面板或 curl 查看):

本地测试好公共服务代码后,把 ES 连接地址改成内网 IP,然后发布到云端。

接下来试着编写一个其他的函数来访问公共 ES 服务,比如插入资源到 ES,通过 callFunction 请求:

但是,数据并没有被成功插入,而是返回了接口超时,Why?

通过日志得知是 ES 连接不上,会不会是因为发布上线的 ES 公共服务所在的机器和 ES 不在同一个内网呢?

所以需要在云开发控制台更改 ES 公共服务的私有网络配置,选择和购买 ES 时同样的子网就行了:

配置 ES 云函数私有网络

修改之后,再次远程请求 ES 公共服务,数据就插入成功了~

开发好 ES 公共服务后,就可以编写具体的业务逻辑了。

首先要在 ES 中建立一个索引(类似数据库的表),来约定数据的类型、分词等信息,而不是允许随意插入数据。

比如为了更灵活搜索,资源名应该指定为 "text" 类型,以开启分词,并指定 ik 中文分词器:

最好还要为索引指定一个别名,便于后续修改字段时重建索引:

编写好建立索引的 json 配置后,通过 curl 或 Kibana 去调用 ES 新建索引接口就行了。

之前,编程导航网站的资源数据都是存在数据库中的,用户从数据库中查询。而现在要改为从 ES 中查询,ES 空空如也可不行,得想办法把数据库中的资源数据同步到 ES 中。

这里有几种同步策略。

以前,用户推荐的资源只会插入到数据库,双写是指在资源插入数据库的时候,同时插入到 ES 就好了。

听上去挺简单的,但这种方式存在一些问题:

那有没有对现有代码 侵入更小 的方法呢?

如果对数据实时性的要求不高,可以选择定时同步,每隔一段时间将最新插入或修改的数据从数据库复制到 ES 上。

实现方式有很多种,比如用 Logstash 数据传输管道,或者自己编写定时任务程序,这样就完全不用改现有的代码。

如果对数据实时性要求很高,刚刚插入数据库的数据就要能立刻就能被搜索到,那么就要实时同步。除了双写外,还可以监听数据库的 binlog,在数据库发生任何变更时,我们都能感知到。

阿里有个开源项目叫 Canal ,能够实时监听 MySQL 数据库,并推送通知给下游,感兴趣的朋友可以看看。

Canal 项目

由于编程资源的搜索对实时性要求不高,所以定时同步就 ok。

云开发默认提供了定时函数功能,我就直接写一个云函数,每 1 分钟执行一次,每次读取数据库中近 5 分钟内发生了变更的数据,以防止上次执行失败的情况。此外,还要配置超时时间,防止函数执行时间过长导致的执行失败。

在云开发 - 云函数控制台就能可视化配置了,需要为定时任务指定一个 crontab 表达式:

配置云函数定时和超时

开启定时同步后,不要忘了再编写并执行一个 首次 同步函数,用于将 历史 的全量数据同步到 ES。

现在 ES 上已经有数据了,只剩最后一步,就是怎么把数据搜出来呢?

首先我们要学习 ES 的搜索 DSL(语法),包括如何取列、搜索、过滤、分页、排序等,对新手来讲,还是有点麻烦的,尤其是查询条件中布尔表达式的组合,稍微不注意就查不出数据。所以建议大家先在 Kibana 提供的调试工具中编写查询语法:

Kibana 调试

查出预期的数据后,再编写后端的搜索函数,接受的请求参数最好和原接口保持一致,减少改动。

可以根据前端传来的请求动态拼接查询语法,比如要按照资源名搜索:

由此,整个网站的搜索优化完毕。

再去试一下效果,现在哪怕我输入一些多 “鱼” 的词,也能搜到了!

新 ES 搜索接口的发布并不意味着老的数据库查询接口淘汰,可以同时保留。按名称搜索资源时用新接口,更灵活;而根据审核状态、搜索某用户发布过的资源时,可以用老接口,从数据库查。从而分摊负载,职责分离,让对的技术做对的事情!

我是鱼皮,最后再送大家一些 帮助我拿到大厂 offer 的学习资料

指路:https://t.1yb.co/qOJG

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

指路:https://t.1yb.co/w66s




检索网站有哪些
检索网站有很多种,其中一些最知名和常用的包括谷歌(Google)、必应(Bing)、百度(Baidu)、雅虎(Yahoo)等。这些搜索引擎都提供了强大的搜索功能,可以帮助用户快速找到他们需要的信息。首先,谷歌是全球最大的搜索引擎,它以其强大的搜索算法和广泛的覆盖范围而闻名。谷歌不仅提供了基本的网页搜索,还...

元搜索主要元搜索引擎列表
在国内元搜索引擎市场,有几家值得关注的平台:搜魅网 (Someta):它整合了百度、Google、搜狗和雅虎等主流搜索引擎,提供网页、资讯和网址导航等多元查询,还拥有独特的网站查询功能,突破了传统元搜索引擎的局限。比比猫 (Bbmao):凭借其独特的聚类和去重技术,搜索结果智能分类,去重效果显著,尤其适合专业...

不想用百度了,有没有其他好用的搜索网站?
1、DuckDuckGO如果你能翻得了墙壁,那么推荐这个搜索引擎。网站logo是只奇怪的丑萌鸭子,但是其背后的搜索技术是很强大的,并不亚于谷歌。重点是DuckDuckGO专注隐私保护,在反追踪以及避免信息过滤等方面做得特别好,如果你厌烦了百度这类不良服务商疯狂得搜集您的用户信息,那么你可以选择这款搜索引擎,保护...

公司网站中增加制作搜索功能的价格
看一下网页源文件的后缀名是不是html或htm.如果是,就是静态的,6200太黑了,估计300就行了.如果是asp或aspx或php,就是动态的,不过6200还是太黑了,估计价格应该不会超过1000.如果对动态网页,加一个搜索功能很容易,加100就多了.

搜索引擎优化的发展历史
1995年底,Alta Vista推出,由于它具备大量的新的搜索功能,深受大众好评,Alta Vista是第一个支持自然语言搜索,具备了基于网页内容分析、智能处理的能力,第一个实现高级搜索语法的搜索引擎(如AND,OR,NOR等),同时还能搜索新闻群组中的内容,还能搜索图片。这一阶段也是yahoo发展的初期阶段,大多数人在这个时候对搜索并不...

来个网站
答案:可以提供一个综合性的搜索引擎网站——谷歌。详细解释:谷歌是全球最受欢迎的搜索引擎之一,因其强大的搜索功能和用户体验而受到广泛赞誉。以下是关于谷歌网站的几个关键点:一、搜索功能全面且强大 谷歌拥有先进的搜索算法,可以迅速准确地为用户提供所需信息。无论是学术知识、新闻报道、实时天气,...

搜索引擎的发展史
用户必须输入精确的文件名进行搜索,Archie告诉用户哪个FTP服务器能下载该文件.虽然Archie搜集的信息资源不是网页(HTML文件),但和搜索引擎的基本工作方式是一样的:自动搜集信息资源,建立索引,提供检索服务.所以,Archie被公认为现代搜索引擎的鼻祖.Robot(机器人)一词对编程者有特殊的意义.Computer Robot是指某个能以人类...

搜索引擎的发展趋势
这种评价体制与《科技引文索引》的思路非常相似,但是由于互联网是在一个商业化的环境中发展起来的,一个网站的被链接数量还与它的商业推广有着密切的联系,因此这种评价体制在某种程度上缺乏客观性。2)基于访问大众性的搜索引擎 基于访问大众性的搜索引擎的代表是direct hit,它的基本理念是多数人选择访问...

Pinterest的新搜索过滤器如何帮助用户根据头发纹理找到相关灵感?_百度...
引领潮流的 Pinterest 推出全新头发纹理搜索功能Pinterest 破新升级,为用户提供了一种全新的搜索体验——头发纹理过滤器,让发型搜索变得更加精准和个性化。现在,当你在 Pinterest 搜索心仪的发型时,搜索栏下将新增五个关键选项:卷曲、直发、波浪、剃光\/秃头,以及保护性风格,旨在满足不同发质的灵感需求...

搜索建议功能的设计
在“建议的搜索”下拉列表中,每个建议包含两部分:用户已键入的字符和系统为完成查询而建议的字符。使用不同的视觉样式来显示属于每个类别的字符是很重要的。您可以使用粗体、斜体、颜色或缩进来传达这些部分之间的差异。视觉差异化帮助用户理解显示建议的原因并扫到可用选项。网站提供的建议类型应帮助您确定...

鄂州市13144732263: seo优化的目的能够给网站带来什么益处? -
司品去氧: seo优化对网站的好处:1.削减网页体积,加速加载速度 网页体积越大,关于服务器的加载速度或者说用户的网速要求就会有所降低,假如网速一般的情况下,页面过大,那加载的时刻就会比较长,十分不利于用户体验,你想假如要翻开一个网...

鄂州市13144732263: 如何做好网站的SEO优化? -
司品去氧: SEO 优化大致包含4个方向,内部结构优化、内容优化、内链优化、外链优化.一、内部结构优化1.TDK优化:这里的TDK并不止首页,还有栏目页和文章页的TDK,这就是为什么建站的时候选择可以自定义标签的原因.T即title,网站的标题,...

鄂州市13144732263: seo优化重视站内搜索的意义你知道吗?
司品去氧: 留个脚印```````楼主高人啊,我先收藏了目前大多数网站都不重视站内搜索,但这是非常重要的,因为它能够告诉你用户的意图.通过外部搜索引擎来到你网站的用户,你并不能完全知道他们的想法.而他们在站内搜索的行为是非常具有研究意义的

鄂州市13144732263: 网站优化主要内容包括哪些 -
司品去氧: 包括站外和站内两大块:一、站外优化站外优化,也可以说是脱离站点的搜索引擎技术,命名源自外部站点对网站在搜索引擎排名的影响,这些外部的因素是超出网站的控制的.最有用功能最强大的外部站点因素就是反向链接,即我们所说的...

鄂州市13144732263: 网站优化与搜索引擎优化是否一回事?有人知道吗... -
司品去氧: 网站优化可以从狭义和广义两个方面来说明,狭义的网站优化,即搜索引擎优化,也就是搜索互联网站设计时适合搜索引擎检索,满足搜索引擎排名的指标,从而在搜索引擎检索中获得排名靠前,增强搜索引擎营销的效果;广义的网站优化所考虑的因素不仅仅是搜索引擎,也包括充分满足用户的需求特征、清晰的网站导航、完善的在线帮助等,在此基础上使得网站功能和信息发挥最好的效果.也就是以企业网站为基础,与网络服务商(如搜索引擎等)、合作伙伴、顾客、供应商、销售商等网络营销环境中各方面因素建立良好的关系.

鄂州市13144732263: 网站搜索引擎的优化技巧主要有哪些 -
司品去氧: 站长朋友都知道国内外的几大搜索引擎:百度、谷歌、雅虎、搜搜、搜狗、有道、必应等等,不过相信大家都知道,在站长朋友心目中地位最重的是:百度、谷歌这两大搜索引擎,其实在之前我也曾经在A5里面比较过两大搜索引擎的差异,但...

鄂州市13144732263: 网站性能优化有哪些 -
司品去氧: 内部的链接结构 尽量改变原来的图像链接和flash链接,使用纯文本链接,并定义全局统一链接位置. 标题title的定位 标题中需要包含有优化关键字的内容,同时网站中的多个页面标题不能雷同,起码要能显示“关键字——网站首页——一段简单...

鄂州市13144732263: 新建的网站怎么进行SEO优化,优化了有什么作用? -
司品去氧: 第一步就是关键词的选择,由于这个行业做优化的不是很多,大部分的企业都是在做百度竞价,所以关键词选择了难度比较大的词,也就是主词.之后标题和描述的写法都很自然的将关键词包含其中,然后开始第二部.第二步就是对程序基本...

鄂州市13144732263: 站内优化对SEO有何好处 -
司品去氧: 站内优化对SEO的好处是更友好的迎合搜索引擎,有利于搜索引擎对我们的网站进行抓取收录,而且提升排名,也是为了迎合用户对我们网站的体验度.站内优化的方面有: 1、网站整体结构清晰, 2、网站内容有价值,能解决用户需要的, 3、网站各个页面合理布局关键词, 4、关键词做超链接, 5、图片做alt标签, 6、坚持每天原创文章更新, 7、交换优质友链,

鄂州市13144732263: 网站的优化对于网站的好处有什么 -
司品去氧: 很多人只知道有网站优化这么一说,对网站优化的好处并不清楚.本文就将具体说一下网站优化的好处. 网站优化的好处之一:低投入高回报.与传统的百度推广相比,网站优化即使包给指定的网站优化公司来做,一年也只有几千块钱(3-5个...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网