腾讯云分词(腾讯云分词搜索)

admin 138 2022-11-21

阿里云服务器优惠多,折扣错,惊喜多,请咨询:www.wqiis.com

本文目录一览:

搞懂自定义域名

上次写了一篇给 Gihub Pages 添加自定义域名的文章,之后感觉写得还是偏实践多一点,只做到了受人以鱼。

为了让大家在别的场景下也能搞定自定义域名,比如腾讯云网页部署、Heroku 自定义域名、自定义 CDN 域名。,今天就来写篇更通用的文章来总结一下自定义域名那些事。

如果我们要访问一台电脑上的资源,一般是需要通过 IP 地址来进行访问的。比如电脑上跑了一个 React App,那么在电脑的 就可以访问本机的页面

假如电脑 IP 地址为 192.168.1.10 ,而且手机和电脑都连上同一个 Wifi,那么在手机上输入 也可以访问到这个网页。

当我们访问服务器上的文件(html, js, css 等),其实本质上也是访问远端的一台电脑,也需要通过 IP 地址来访问。这就导致一个问题了:没人能记得住这串数字。

既然记不住就起个名字喽。 这就是域名的由来,也就是像下面这样 Map。

但是等我们给这个 IP 起了新名字之后怎么告诉别人呢?所以,得有一个超大日记本记录上面这些 Map 关系:

DNS (Domain Name System) 服务器就是帮我们记录并解析上面这些关系。这也就是为什么面试题 “输入 URL 之后会发生什么” 里会有一步是要到 DNS 服务器解析 IP 地址,好让我们访问到正确的服务器资源。

当然,DNS 解析服务并不单单只有 域名 - IP 地址 一个功能,还能解析邮件服务器、CNAME 配置等。下面我就直接结合 腾讯云 的 DNS Pod 的解析规则来说明吧。

首先,上面一直在说的 域名 - IP 地址 这样的 Map 记录叫做 A 记录,也即 Active Record。 是最最最常见的域名解析。

比如我们买了个服务器,一般都会有公网的 IP 地址,我们只需要添加一条 A 记录,把域名指向自己服务器的 IP 地址就好了。

另一个常见的例子就是 Github Pages 自定义域名 其中 的一种配置:添加 4 条 A 记录,分别指向下面的 IP 地址:

CNAME 就是域名的昵称,可能理解为 IP 的昵称(域名)的昵称(CNAME)就是 CNAME。其实我们平常更多接触到的并不是 A 记录,而是 CNAME 记录,常见于一些部署平台上。

当部署你的个人网页时,这些部署网站都会自动给你一个非常 Low 的域名,比如 Github Pages 的 haixiangyan.github.io ,或者 Heroku 的 haixiangyan.heroku.app ,再或者腾讯云的 “乱码” 域名 thedemo-9gf4vat5207cf224-1253834571.ap-shanghai.app.tcloudbase.com 。

只要我们有了自己的域名,在 DNS 上添加一条 CNAME 记录,指向上面这些第三方服务商自动自成的域名,那么就能通过我们的域名直接访问第三方服务平台上的资源了。

另外一个常见的场景就是 CDN 服务器,如果在腾讯云上买了一个 CDN 服务器,它也会提供一个 “不那么乱码” 域名,比如我的个人网站就是 。同理,在 DNS 添加一条 CNAME 记录指向 CDN 提供的域名就能访问 CDN 上的资源了。

这个 TXT 记录,目前我使用到的场景是域名验证操作:当腾讯云要验证这个域名是否是合法/激活的,那么需要你在 DNS Pod 上添加一条 TXT 记录,记录值腾讯云会提供给你。

添加了之后,腾讯云就会查看这条 TXT 记录值是否正确,从而验证域名是否合法。

上面的 A 记录填写都是针对 IPv4 的 IP 地址,也是最最最常见的 IP 地址。计算机发展到现在,有些已经用上了 IPv6 了,所以 AAAA 记录就是用来解析成对应的 IPv6 地址的,不过目前用的很少。

NS 也就是 Name Server。还记得上面说到的 DNS 么?NS 可以理解为 DNS 服务器。

一般域名服务商都会有自己的 NS,并且都默认使用自己的 NS 来解析域名。如果你不想用当前这个域名服务商的 NS 来解析域名,也可以换成别家的。

除非有特别需求,NS 记录使用场景非常少。

设置邮箱的记录。没怎么用过,不评价。

我们一般接触到的就是上面这些记录,腾讯云还提供了别的记录类型:

注意,上面像 “显性 URL”、“隐性 URL” 可能在别的域名服务器是没有的,比如 namesilo.com 这个便宜货。

讲真,国内的云服务真的做的比国外好太多了,很多功能都很实用,强烈推荐大家使用国内的云。

了解了 DNS 解析记录还不够,还得了解域名的分级。

比如 ,顶级为 com ,二级为 baidu ,三级为 www 。当在我们购买域名时,买的就是 顶级 + 二级域名 ,直接把顶级和二级域名锁死了。

当添加域名解析记录时,可以在 主机记录 这个字段里指定第三级的域名:

图里由上到下配置得到的域名完全体为:

后面两个只是腾讯云给你的示例而已,就不举例了。

子级的好处就在于可以不用上线一个网站就买一个对应域名,太费钱了~ 比如我之前买了 yanhaixiang.cn 这个域名,当要用这一个域名分别指向 国内腾讯云上的个人网站 ,以及 Github 提供的 Github Pages ,在添加两条记录之后:

就可以在 访问国内的 腾讯云个人网站 ,在 则访问 Github Pages 的个人网站 ,非常悠亚。

国内:腾讯云、阿里云华为云等都不错。国外:NameSilo、GoDaddy、AWS等。

个人推荐在国内买,原因是国内的云服务商功能非常齐全,而且服务之间关联度非常高,可以说有了国内域名走遍天下都不怕,没有国内域名啥都捉襟见肘。

除了 .com 和 .cn 常见的顶级域名外,还有 .xyz , .top 这些便宜的顶级域名可以选择。

顶级域名中有一些是比较敏感的,比如 .law ,这种就只能由专业机构来注册:

如果实在想要 .com 这种牛逼的顶级域名,可以试着买带 - 的二级域名,比如我之前就买了一个 easy-refer.com 的域名,19 刀/年。

二级域名允许有 - 的原因是为了解决名字的混淆问题,比如你的公司叫 Who Represents ,然后你注册了一个 whorepresents.com 的网站,由于域名是不区分大小写的,很容易被误解为 Whore Presents ,变成了 妓女的礼物 。除了这个,还有 Experts Exchange 的 expertsexchange.com 被理解成 Expert Sex Change ,当场社死。

加了一个 - 连字符可以更好地 “分词”,不被别人误解网站内容。

二级域名除了英文还能选择中文的,比如《爱情公寓》里的 www.张伟是混蛋.com :

不开玩笑,这个网站也是能正常访问的,里面的内容都是和《爱情公寓》有关的内容。最旧的贴子是 2011 年,这个网站大概也是那个时候上线的吧,不知不觉已经过了 10 年了呢~

由于域名的 “唯一性”,在当年,注册了一个好的域名比建一个好看的网站更值钱,比如 apple.com , baidu.com 等。这也导致出现了一些投机分子:一出手就买一堆域名,然后等公司上门收购域名。

只有国内的服务商需要做域名备案,也算是中国特色。最近我备案了 3 个域名,每个域名备案大概需要 1 个月的时间来备案。备案也不仅仅填几个表格就完事了,还是挺多地方要注意的。

按照国内相关法律,域名备案前 必需要有一台租期大于 3 个月的服务器。 而国内一些云厂商为了能绑定销售,一般都要你买自家的服务器。

当然,只要有一台上面的服务器,在期间内可以给多个域名进行备案。

还有一点域名之间不能同时备案,一时间只能备案一个。所以如果你有多个域名要备案,要挑最紧急的那个来备案哦~

给你的网站起名是非常困难的一件事,我经常被打回,如果你做的是个人网站推荐使用 “个人项目展示” 这个名字,“个人网站” 是黑名单中的名字。

紧急联系人电话最好别瞎填,有的时候备案那边的人会抽查这个电话,如果这个紧急联系人电话打不通,接不了,那么你还得更换,更换本质上是又要有一遍备案流程,所以最好一开始就弄好这个,别问我是怎么知道的。

现在备案需要签署一份类似“合同”之类的文件,需要用到红色印泥,这个在打印室就有(当时我差点在网上买了一个)。

不过,就算备案有问题,工作人员几乎 1 天就打电话过来让你改正的,所以不用太慌~

最后,稍微总结一下:

浅谈中文分词与自然语言处理

最近出于兴趣和需要,重新回顾中文分词技术,期间有些心得,以及一些关于自然语言处理的浅薄之见,这里简单分享一下。

首先, 中文分词_百度百科 里面简单介绍了其中主要的分词算法以及相应的优缺点,包括字符匹配法、统计法以及理解法,其中字符匹配法和统计法比较流行且可以取到相对不错的效果,而理解法则相对比较复杂高级,但是我认为这才是真正解决中文分词任务的根本算法。

如今用于中文分词的算法和模型虽算不上比比皆是,但也算是唾手可得,开源的如jieba、ltp、Hanlp等等,提供中文分词服务的如腾讯云、百度大脑、讯飞AI平台等,以及其他如Jiagu等。

其实这些平台算法的差距并不算太大,分词准确率基本上都是在80%以上,然而在98%以下(这里胡诌个数),在一些不太严格的应用场景下基本已经够用了,只要挑一个在自己的业务场景下表现最好的即可。

在我看来,对于中文分词这项任务而言,最关键最核心的其实并不是算法模型,这些都不是所谓的瓶颈,最重要的其实是高质量、大规模的词典。对于字符匹配法而言,词典是基础,没有词典自然连分都分不出来;对于统计学习法而言,其效果一方面取决于算法和模型的选择,一方面取决于其训练数据的数量与质量,需要堆人力物力,比如找专门的标注公司标注数据等。但是就算是人标的数据,也难免有所错误遗漏,所以在有错误的训练数据下,模型也不可能学的太好,同时训练数据再大,也难以覆盖全部语料,总会出现OOV,总有些句子会训练不到,此时还强求模型可以做到“举一反三”有些不切实际。

词条中还提到了关于中文分词的技术难点:歧义识别与新词识别,关于歧义识别,上面并没有提具体的解决思路,对于新词识别而言,这又是自然语言处理领域很基础并且很重要的点,可以参见一下我之前的文章: 《NLP基础任务之新词发现探索之路》 | lightsmile's Blog ,也有另一个思路,比如说爬取网上一些网站的相关条目,比如百度百科等。

简单看了一下 jieba 、 ansj_seg 、 Jiagu 的分词词典,发现其中jieba的词典质量最差,其中不少词性都是错误的,Jiagu的词典还算不错,就是一些新词不全,ansi_seg的没有细看。

尽管这些工具在一些评测数据的结果可以达到90以上的成绩,但是在我看来,还是不够的,我觉得中文分词这个基础而又艰巨的任务还是要到99%以上才可以,否则分词都分不对,那些在分词基础之上的任务更是不行,毕竟词是基本的语义单元。

然而在现在深度学习盛行的潮流下,许多任务如文本分类、命名实体识别等并不一定需要依赖于分词,直接基于字符(char)的Embedding也可以取得不错的效果,并且也可以规避OOV(out of vocabulary words,未登录词)的问题。

但是深度学习,尤其是监督学习的很关键之处是得有大规模的高质量训练数据,不然巧妇难为无米之炊,再好的模型也难以从垃圾中学到有用的知识。

话说回来,虽然自然语言处理是计算机科学与其他领域的交叉学科,深度学习、机器学习算是人工智能的一部分,然而许多时候往往十分依赖人工,而所谓的智能其实也不智能。

无论是计算机视觉领域里的图像分类还是自然语言处理领域的文本分类,其任务都是学习一个从输入 映射到输出或者说标签 的函数 ,具体来说就是将 表征为多维向量 ,将 表征为多维向量 ,然后让 进入一个模型进行一系列的运算后得到一个 ,通过不断地比较 和 的值并调整模型的参数使模型的运算结果 更为准确即更加贴近 (过程有点类似于 “猜数字”游戏 ),从而最终得到一个近似函数 ,我们就可以用来代替未知的 用于预测未来的样本 ,得到它对应的 。

我们可以发现,以上学习算法确实可以得到能够解决问题的模型,然而局限之处在于它也只能做这个任务,即对输入 预测 ,别的啥也干不了。

同时在基于深度学习的自然语言处理模型中,基本套路都是Embedding+Encoder+Decoder,其中Embedding是基于字还是基于词,是使用预训练词向量还是随机初始化,这些选择所导致的效果的差异都随着训练轮数的增加而最终减小。然而,由于梯度下降以及解空间的特点,基于bert的效果确实是要比Word2Vec的要好,那些词向量确实比Word2Vec的嵌入了(或者说学到了)更多的语言知识。

关于模型的选择和取舍,工业界和学术界的标准其实差别很大。学术界里有的论文是开创性的,而许多论文其实都是在原来基础上小修小改,将最近的较新的思想和算法一堆,实验结果比原来指标高一点又是一篇文章,程序运行占用多大内存、跑了多长时间这些都不是主要因素,也就是一切向指标看齐。

而工业界则更加看重的是性价比,不同的公司、不同的部门、不同的阶段其主要矛盾不同。比如说Facebook之前出的fastText,尽管模型很简单,最终效果可能比不上一些其他复杂的模型,但是其训练速度超快、基于CPU就可以,并且可以很方便地对模型进行压缩。许多时候,一些指标高低差几个点并没有那么关键,模型大小、训练时间、预测时间在很多时候是比较关键的因素,除非由于甲方或客户不满意,或者家大业大,有的是资源,那么这时候效果和指标又成为主要矛盾,这时的优化可能要以一定的时间和空间为代价。

原来的自然语言处理各任务基本上都构建在分词的基础之上,粗略来说有一个 语法 、 语义 到 语用 的递进的过程。这一层一层的任务虽然耦合的很好,但是

这种Pipline将会导致下层的错误都将会被积累到上层,其直接影响就是越到上层其准确率越低,甚至低到惨不忍睹的程度。然而在表示学习,尤其是深度学习崛起以后,其强大的特征学习能力,使得现在的模型多为end-to-end模型,其结果是一方面可以使得相关人员摆脱繁琐的特征工程,可以将特征提取与组合设计的工作交给神经网络模型去隐形完成,大大解放了生产力;令一方面可以将模型视为整体的一部分,即它的输入直接对应原始输入,它的输出直接是我们想要的结果,有点直达病灶的意思,摆脱了原来Pipline错误累积的困境。

不过我个人看来成也end-to-end,败也end-to-end,虽然简化了任务,但是有点太过开门见山,得到的模型一个个都是彼此孤立的,各做各的事情,然而从整体论的角度来看它们都是整个自然语言处理系统的一部分,一些特征本来是可以共享,一些结果是彼此相互依赖的。这也又涉及到参数共享、多任务学习等概念,不细表。由于神经网络的可解释性较差,这使得模型更加像一个黑盒,训练调参的过程更像是在炼丹,因为谁也不知道具体能炼出个什么玩意儿。

如下图很形象地诠释了这一现状:

下面就深度学习下的自然语言处理四大任务进行简单对比(都是个人浅薄之见,难免有不足之处,还望海涵)。自然语言处理四大任务分别是:序列标注、文本分类、句子关系、文本生成。

序列标注任务的原始语料是一连串的句子,经过标注后的语料格式大概如下(以命名实体识别为例):

我们可以发现,每一行的格式都是一个字符以及它所对应的类别,如 B_{type} 、 O ,那么对于每一个字符模型需要预测的类别数量总计为 2*len(types) + 1 ,其中2是指 BI 这种标注规范, len(types) 指类型种类的数量(如人名、地名、机构名共三种),1是指 O 。可以发现模型需要拟合的函数的值域还是很小的,即 O(len(types)) 。

文本分类任务的标注语料格式大概如下(以情感极性分析为例):

每一行的格式都包含原始文本以及它所对应的类别(或者说标签),我们可以发现模型需要预测的类别数量总计为 len(types) ,即类型种类的数量(以新闻语料分类,如 娱乐 、 军事 、 科技 、 体育 等),可以发现模型需要拟合的函数的值域也是较小的,即 O(len(types)) 。

句子关系任务的标注语料格式大致如下(以语句相似度为例):

每一行都是两个句子以及它们的关系( 1 代表语义相同, 0 代表语义不同),我们可以发现模型需要预测的类别数量总计为 len(relations) ,即关系种类的数量,可以发现模型需要拟合的函数的值域也是较小的,即 O(len(relations)) 。

文本生成任务的标注语料格式大致如下(以机器翻译为例):

我们可以发现每一行都是源语言句子以及目标语言的对应翻译。虽然此时模型和序列标注模型一样都需要对于单个样本预测多次,但是序列标注模型需要预测的次数直接等于字符的数量,是确定的,但是文本生成任务模型需要预测的次数是不确定的,并且每次预测的值域都是目标语言所有word(或者character)所组成的整体集合,即 O(len(words)) ,其规模可能是十万级或百万级的。因此我们很容易发现文本生成任务的难度和复杂程度是要远远高于其他任务的。对话任务如生成式闲聊机器人更是如此。

可能是之前的AlphaGo过于吸引广大群众的眼球,做相关业务的公司吹的太厉害,以及“人工智能”、“深度学习”这几个词听起来逼格满满,导致许多外行人认为现在的人工智能已经发展到很厉害的层次,并且可以做各种各样的事情,似乎无所不能。但是内行人心里却明白:“什么人工智能,人工智障吧”、“所谓人工智能,多是智能不够,人工来凑”。外行人看不到深度模型算法的局限性,如许多模型的精度并不能达到那么高;也看不到深度模型算法的前提条件,如高质量、大规模的数据集,他们以为模型大约聪明到随便喂点数据便成为终结者般的存在。这也就导致了他们刚开始预期很高,然而在投资或找到外包后发现效果远远不能达到预期,大失所望而潦草结束或撤资离场的局面。

如下一张图大概有点这个意思:

统观学术界与工业界,和计算机视觉领域相比,自然语言处理这种更深层次的、涉及到认知智能的领域的进展虽悠久但缓慢,并且许多任务目前为止距离真正商用还有很大的距离。然而正是科学史上如阿基米德、牛顿等伟大人物与其他相对无名之辈默默耕耘,前赴后继,才使得如今之人类齐享先辈之成果,即所谓“前人栽树后人乘凉”也。

我辈也无需悲观,须戒骄戒躁,搞算法的就多己见、少盲从,少水论文;搞工程的就多积累经验,提升实践能力,多做高质量的项目。功夫不负有心人。

未来要联合1万家合作伙伴,腾讯云率先公布AI新基建全景布局

在腾讯官方正式宣布未来将投入5000亿布局新基建之后,腾讯云AI迅速跟进,在5月27日的媒体开放日上,首次公布了在人工智能领域新基建的完整布局。除了要持续完善算法平台、服务平台以及开放平台三大平台之外,还将联合超过1万家合作伙伴,打造一个从技术研发到产业落地相互协同、优势互补的新型AI生态体,推动各行各业的整体化智能化升级。

据了解,目前腾讯云AI公有云日处理图片超30亿张,日处理语音250万小时,自然语言处理超千亿句,客户数超过200万,服务全球超过12亿用户,多项指标位居行业第一。腾讯云已经成为中国最大的人工智能服务提供商之一。

细看这些指标,其实与我们的生活息息相关。例如腾讯云AI对于图片的处理能力,在人脸核身、OCR(光学字符识别)、图像检测等方面都有广泛应用。深圳公安接入腾讯云慧眼之后,广大群众通过手机就可以线上进行身份核验并办理各种业务,网上办理量年均1600万次,节省市民办事成本约10亿元。

顺丰在使用腾讯云OCR之前,需要8000个人力做订单录入,每年耗费成本上亿;使用OCR之后简单扫一扫即可把手写文字转换为电子版,大部分字段准确率98%以上,3小时可识别2000万张。国内知名液晶面板制造商华星光电,在腾讯云帮助下利用AI智能识别面板缺陷,用自动化代替原先的人力看照片,速度提高5-10倍,人力降低50%。

此外,在微信的语音转文字、 游戏 领域的多国语言翻译、金融及 旅游 等行业的自动翻译、智能音箱的人机对话、网络读物的有声转换等方面,腾讯云AI的语音处理和自然语句处理能力也到了充分展现。

"在产品层面,腾讯云拥有全球最为完整的人工智能产品矩阵,其中视觉服务包括腾讯云神图、慧眼、图像分析、智能识图以及OCR;智能语音产品包括腾讯云语音识别、语音合成、机器翻译等;自然语言处理产品包括 情感 分析、智能分词、文本纠错等16种能力。"腾讯云AI语音语义与应用平台产品中心总经理周超博士表示。

今年的政府工作报告指出:"加强新型基础设施建设,发展新一代信息网络,拓展5G应用,建设充电桩,推广新能源 汽车 ,激发新消费需求、助力产业升级。"这是"新基建"首次被纳入政府工作报告,意味着新基建正式进入加速期。

作为新基建的七大产业领域之一,人工智能在数字经济发展中占据着重要地位。据腾讯云相关负责人透露,腾讯云正从多个层面进行AI新基建的布局,包括联合腾讯内部优图实验室、AI Lab、微信人工智能实验室等优势技术能力打造产业智能化新引擎。

具体来说,腾讯云AI新基建的整体布局是"一云三平台"架构,即基于腾讯云强大的弹性计算、无限存储、加速网络以及全域安全能力为腾讯云AI提供强大的底层算力资源。

"三平台"包括算法平台、服务平台以及开放平台。其中,算法平台通过不断完善算法核心框架、深度学习工具、AI中台能力,打造数据到算法模型的全流程闭环,真正的将AI能力应用到实际的业务场景中;AI服务平台通过将腾讯内部多年积累的语音、图像、视频、NLP等AI技术能力以云服务的形式提供给行业用户,降低AI的应用门槛;同时,全面升级腾讯AI开放平台,连接腾讯AI能力与产业,推动AI技术和应用的不断进步。

未来,腾讯云AI还将联合超过1万家生态合作伙伴,打造从技术研发到产业落地的新兴AI生态体,推动各行业智能化升级。有业内人士分析指出,AI领域的整体技术进步和大规模应用落地,将是中国疫情后时代经济增长的重要驱动,将深入影响到 社会 生活的方方面面。

以此次疫情来说,腾讯" 健康 码"成为最多人使用的 健康 及出行电子凭证。自2月9日率先在深圳落地以来,上线36天,腾讯 健康 码已被9亿用户使用,累计访问量达80亿

民众在申领 健康 码过程中,全国多个省份的 健康 码都会用到身份核验的过程,腾讯云慧眼人脸核身提供的各类认证功能模块,包含证件 OCR 识别、活体检测、人脸比对及各类要素信息核验能力,帮助 健康 码解决了大量用户身份信息在线核实的需求,有效阻断了疫情的进一步传播,为复工复学奠定了坚实的基础。目前,腾讯云慧眼被广泛应用于金融、政务民生等领域。

可以看到,人工智能正在与各行各业快速融合,在推动传统行业转型升级、提质增效的同时,也不断催生出新技术、新模式、新业态,以人工智能为代表的信息化技术将成为智能化经济的核心驱动力。作为中国最大的人工智能服务商,腾讯云在AI新基建领域的率先布局和持续推进,必将加速我国产业智能化的深入变革。

优化了破网站的搜索功能

大家好,我是鱼皮,今天搞一场技术实战,需求分析 = 技术选型 = 设计实现,从 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 的官方文档看一遍就行了,后面会把代码开源到编程导航仓库中()。

编写好代码后,可以用云开发自带的 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 的学习资料 :

指路:

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

指路:

上一篇:江苏阿里云服务器代理(服务器代理公司)
下一篇:华为云nas(华为云南代表处)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~