最新版本:网站搜索大优化!

优采云 发布时间: 2022-09-24 23:16

  最新版本:网站搜索大优化!

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

  大家好,我是玉皮。今天,我将搞一场技术战,向大家展示如何优化网站搜索的灵活性。

  ES+云开发搜索优化实践

  本文提纲:

  鱼皮 - 网站搜索优化背景

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

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

  例如,网站 上有一个名为“Java Design Patterns”的资源,但是当用户搜索“Java Design Patterns”时,他们什么也找不到。原因是资源名称中收录空格,用户搜索时输入的。关键词 不收录空格。

  空格只是一个特例,类似的情况还有很多。比如网站上有一个资源叫做“Java并发编程实践”,但是当用户搜索“Java实践”时,很明显前者收录了“Java”和“Practice”这两个词,但是什么都找不到。

  要知道搜索功能对于一个信息聚合网站来说是非常重要的,它直接影响到用户的体验。如果您在 网站 上找不到资源,谁会使用它们?

  所以我也得到了一些朋友的客气建议,比如这个秃头汤姆:

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

  技术选型

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

  前端全文搜索

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

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

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

  var idx = lunr(function () {<br />  this.field('title')<br />  this.field('body')<br />  // 内容<br />  this.add({<br />    "title": "yupi",<br />    "body": "wx搜程序员鱼皮,阅读我的原创文章",<br />    "id": "1"<br />  })<br />})<br />

  然后只需搜索:

  idx.search("鱼皮")<br />

  纯前端全文搜索的优点是不需要后端,简单方便,可以节省服务器压力;无需连接互联网,也没有额外的网络开销,检索速度更快。

  后端全文搜索

  与前端不同的是,后端全文搜索是在服务器上进行的,从远程数据库中搜索出符合要求的数据,然后直接返回给前端。

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

  它的功能强大灵活,但需要构建、定义数据、管理字典、上传和维护数据等,操作性强,需要一定的技巧。新手和大佬们设计的ES搜索系统大不一样。.

  所以对于不熟悉Elasticsearch的同学,也可以直接使用现成的全文搜索服务。例如,Algolia 可以通过其提供的 API 直接上传要检索的数据,然后使用其提供的 API 进行检索。它提供了一定的空闲空间,足够小网站和学习使用。

  Algolia 搜索服务选择

  那么我应该为我的编程导航选择哪个实现网站?

  首先,这个网站的资源数量不是固定的,不定期动态更新,所以不适合前端全文检索。

  其次,考虑到以后网站的数据量会比较大,可能需要根据用户的搜索动态优化检索系统(比如自定义编程字典),考虑使用Elasticsearch技术自己构建搜索引擎,而不是现成的全文搜索服务,让你以后可以按照自己的意愿定制系统。另外,不需要向其他平台发送网站数据,可以保证数据的安全。

  ES安装

  决定使用 Elasticsearch 后,首先需要搭建环境。

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

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

  

  Cloud ES集群架构图

  ES服务的价格虽然贵,但是对于我来说省下不少时间成本还是很值得的。

  还有一个非常方便的自定义搜索服务Elastic App Search,有兴趣的可以试试。

  ES 公共服务

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

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

  完成

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

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

  代码非常简单。首先,与 ES 建立连接。为了保证数据安全,请使用内网地址:

  const client = new Client({<br /> // 内网地址<br />  node: 'http://10.0.61.1:9200',<br />  // 用户名和密码<br />  auth: {<br />    username: esConfig.username,<br />    password: esConfig.password,<br />  },<br />});<br />

  然后写CRUD。这里是一个抽象的步骤,通过switch等分支语句,根据请求参数来区分操作、要操作的数据等,这样每个操作就不需要单独写成一个接口了。

  // 接受请求参数<br />const { op, index, id, params } = event;<br />// 根据操作执行增删改查<br />switch (op) {<br />  case 'add':<br />    return doAdd(index, id, params);<br />  case 'delete':<br />    return doDelete(index, id);<br />  case 'search':<br />    return doSearch(index, params);<br />  case 'update':<br />    return doUpdate(index, id, params);<br />}<br />

  在云开发中,如果一个函数长时间没有被调用,就会释放资源。下次请求时,会执行冷启动重新创建资源,导致接口返回慢。因此,将多个操作封装到同一个函数中也可以减少冷启动的机会。

  代码的具体增删改查不再赘述,阅读ES Node官方文档即可,代码会开源到编程导航仓库()。

  本地调试

  写好代码后,就可以使用云开发自带的tcb命令行工具在本地执行功能了。

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

  tcb fn run <br />  --name <br />  --params "{\"op\": \"add\"}"<br />  --path <br />

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

  远程测试

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

  接下来尝试编写一个访问公共 ES 服务的函数,例如将资源插入 ES 并通过 callFunction 请求它:

  // 添加资源到 ES<br />function addData() {<br />  // 请求公共服务<br />  app.callFunction({<br />    name: 'esService',<br />    data: {<br />      op: 'add',<br />      index: 'resource',<br />      id,<br />      params: data,<br />    }<br />  });<br />}<br />

  但是数据没有插入成功,但是返回接口超时,为什么?

  内网配置

  从日志可知,ES无法连接。是不是因为发布ES公共服务的机器和ES不在同一个内网?

  因此需要在云开发控制台中更改ES公共服务的内网配置,选择与购买ES时相同的子网:

  配置ES云功能专网

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

  数据索引

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

  首先,必须在ES中建立索引(类似于数据库的表),以就数据类型、分词等信息达成一致,而不是允许随意插入数据。

  例如,为了更灵活的搜索,应将资源名称指定为“文本”类型以启用分词,并指定 ik 中文分词器:

  "name": {<br />  "type": "text",<br />  "analyzer": "ik_max_word",<br />  "search_analyzer": "ik_smart",<br />  "fields": {<br />    "keyword": {<br />      "type": "keyword",<br />      "ignore_above": 256<br />    }<br />  }<br />}<br />

  并且喜欢的数量应该设置为“长”类型,只允许数字:

  "likeNum": {<br />  "type": "long"<br />}<br />

  

  最好也为索引分配一个别名,以便稍后在修改字段时重建索引:

  "aliases" : { <br />  "resource": {}<br />}<br />

  编写好索引的json配置后,就可以通过curl或者Kibana调用ES新的索引接口了。

  数据同步

  之前编程导航网站的资源数据是保存在数据库中的,用户从数据库中查询。但是现在我们想从 ES 中查询,ES 是不够的,我们必须想办法将数据库中的资源数据同步到 ES 中。

  这里有几种同步策略。

  双写

  过去,用户推荐的资源只插入到数据库中。双写是指资源插入数据库时​​,同时插入到ES中。

  听起来很简单,但这种方法存在一些问题:

  之前的代码会改,每个写数据库的地方都要加ES。

  会出现一边写失败,一边写成功的情况,导致数据库和ES的数据不一致。

  那么对现有代码有没有一种侵入性较小的方法呢?

  定时同步

  如果对数据的实时性要求不高,可以选择定时同步,定时将数据库中新插入或修改的数据复制到ES。

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

  实时同步

  如果对数据的实时性要求很高,刚插入数据库的数据必须能够立即被搜索到,所以需要实时同步。除了双写,我们还可以监控数据库的binlog,可以感知数据库的任何变化。

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

  运河工程实施

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

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

  配置可以在云开发-云功能控制台中进行可视化。您需要为计划任务指定一个 crontab 表达式:

  配置云函数计时和超时

  开启定时同步后,别忘了编写并执行第一个同步函数,将全量历史数据同步到ES。

  数据检索

  既然ES上有数据,就只剩下最后一步了,也就是怎么搜索数据呢?

  首先,我们需要学习ES的搜索DSL(语法),包括如何取列、搜索、过滤、分页、排序等。对于新手来说还是有点麻烦,尤其是布尔表达式的组合查询条件,有点粗心,查不到数据。因此,建议您先在 Kibana 提供的调试工具中编写查询语法:

  Kibana 调试

  找到期望的数据后,编写后端搜索函数,接受的请求参数要和原来的接口一致,减少改动。

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

  // 传了资源名<br />if (name) {<br />  // 拼接查询语句<br />  query.bool.should = [<br />    {<br />      match: {<br />        name<br />      }<br />    }<br />  ];<br />}<br />

  这样就完成了整个网站的搜索优化。

  让我们再试试这个效果,现在即使我输入一些带有很多“鱼”的单词,我也能找到它!

  ES如何实现灵活搜索?欢迎阅读。

  新的ES搜索接口的发布并不意味着旧的数据库查询接口被淘汰,同时可以保留。按名称搜索资源时,使用了新的接口,更加灵活;根据审核状态查找用户发布的资源时,可以使用旧界面从数据库中查找。这样,负载分担,职责分离,正确的技术才能做正确的事!

  解决方法:网站过度搜索引擎优化优化后 常见的康复办法

  现象

  网站过度优化后最常见的现象:

  1.网站排名已暂停,有下滑迹象

  2.部分关键词开始显示排名消失

  3.网站突然停止录制

  4.新发布的内容输入慢或输入后看不到排名等

  

  类型

  其实优化分为很多种,比如首页标题堆叠、首页关键词堆叠、内部页面违规等常见类型。

  1.首页标题被几个甚至几十个剪切符号剪切

  2.对于关键词的密度和频率,关键词是固定分布在页面上的。在头部和尾部批量堆叠锚文本是很常见的。

  3.内页锚文本,加粗,加粗加颜色,加粗加锚文本,关键词over-embedding(头、中、尾位置不自然)比较常见。

  处理方法

  

  1.标题清晰,首页不能放出的词都铺到栏目里。企业站常用产品相关词要充分利用栏目+专页+内页,完成全方位优化。减少首页标题关键词,结合首页标题+首页描述处理消化部分相关长尾关键词,结合首页+描述+关键词+首页内容联合强化中心关键词@ >.

  标题词被尽可能少地分割,特别是对于新网站。太多的词段只会导致进入后降级,并呈现类似于新站点的沙盒假象。请参考姜小僧之前发表的文章,里面有标题的详细说明。

  2.密度要通过页面文字+描述结合页面标题来概括,不要把所有的密度都压到一个项目上。头部和尾部用户关注度较低的地方不要过度堆叠,做好落地页,引导用户在需要转向对应栏目或内容页面时进行精准访问,而不是仅仅介绍没有标题的文本,无论访问如何。

  3.加不加锚文本不会影响排名。将这些粗体和锚文本添加到新站点只会减慢条目速度、减轻重量和过度优化。

  以上是常见的过度优化操作,以及过度优化后如何防止过度优化。

  至于过度优化后的恢复(异地操作),原则是让搜索引擎识别网站从零开始,从零开始爬取,更常用的全站提交、推送等方式,站点地图等,以及一些操作技巧和方法,我们可以进一步评论吗?

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线