面试场景题系列:设计搜索自动补全系统

当我们在谷歌上搜索或者在亚马逊上购物时,只要在搜索框中打字,网页上就会展示一个或者更多的与搜索词匹配的结果。这个功能叫作自动补全(Autocomplete)、提前输入(Typeahead)、边输边搜(Search-as-you-type)或者增量搜索(Incremental Search)。图-1展示了一个谷歌搜索的示例,在搜索框中输入“dinner”后,谷歌显示了一系列自动补全结果。搜索自动补全是很多产品的一个重要功能。这引出了我们的面试问题:设计一个搜索自动补全系统,也即设计一个能展示“Top k查询词”或者“k个最常被搜索的查询词”的系统。

图-1

1.确定设计的边界

在系统设计面试中,第一步是问足够多的问题来厘清需求。以下是候选人与面试官的对话示例:

候选人:系统是只支持匹配查询词的开头部分,还是也支持从其中间开始迚行匹配?

面试官:只支持从头开始匹配。

候选人:系统应该返回多少条自动补全建议?

面试官:5条。

候选人:系统如何确定要返回哪5条建议?

面试官:根据流行度来决定,也即基于历史的查询频率决定。

候选人:系统支持拼写检查吗?

面试官:不,系统不支持拼写检查或者自动纠正。

候选人:查询词都是英文的吗?

面试官:是的。如果最后时间允许,我们也可以讨论一下多语言支持。

候选人:系统允许输入大写字母和特殊字符吗?

面试官:不,我们假设所有的查询词都是小写字母字符。

候选人:有多少用户?

面试官:1000万DAU。

汇总需求:

•快速响应:当用户输入一个查询词时,系统必须快速显示自动补全建议。Facebook工程博客上一篇关于自动补全系统的文章“The Life of a Typeahead Query”显示,系统需要在100毫秒内返回结果,否则会导致用户界面卡顿。

•相关性:自动补全建议应该是与搜索词相关的。

•有序:系统返回的结果必须是根据流行度或者其他排名模型排序的。

•可扩展性:系统必须能应对高访问量。•高可用性:当系统的一部分下线、运行缓慢或者遭遇突发网络故障时,系统应该是可用和可访问的。

1.1 封底估算

•每天有1000万活跃用户(DAU)。

•假设平均每人每天会进行10次搜索。

•假设我们使用ASCII字符编码,那么1个字符占用1字节。假设一个查询包含4个单词,每个单词平均有5个字符,那么每个查询就有4×5=20字节。

•每当在搜索框中输入一个字符,客户端就会向后端发送一个请求以获取自动补全建议。平均来说,每个查询会发送20个请求。举个例子,当你输入完“dinner”这个查询词时,下面的6个请求会被发送到后端。

•每秒处理约24,000个查询(QPS)。

10,000,000×10个查询/天×20字符/查询÷24÷3600≈24,000

•峰值QPS为QPS×2,约为48,000。

•假设每天的查询中有20%是新的,这意味着每天有0.4GB新数据被添加到存储中。10,000,000×10个查询/天×20字节/查询×20%=0.4GB

2 高级设计

总体来看,该系统可以分成如下两部分。

•数据收集服务:它实时收集用户输入的查询并进行聚合。对于大型数据集,实时处理是不现实的,尽管如此,这是一个好的起点。我们会在13.3节中探索更实际的解决方案。

•查询服务:根据查询的内容或者前缀,返回前5个被频繁搜索的词。

2.1 数据收集服务

我们使用一个简化的例子来看一下数据收集服务是怎么工作的。假设我们有一个存储了查询字符串及其频率的频率表,如图-2所示。一开始,频率表是空的。随后,用户按顺序依次输入查询“twitch”、“twitter”、“twitter”和“twillo”。图13-2展示了频率表是如何更新的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode打卡:设计一个ATM机器

执行结果:通过 题目 2241 设计一个ATM机器 一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。 取款时&#xff0c…

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例:显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来 2、右外连接案例:对stu表和exam表联合查询,把…

在 IPhone 上检查 Safari 浏览历史记录的 5 种方法

与其他网络浏览器一样,Safari 会保留您的浏览历史记录,以便您可以输入之前访问过的网页。这是一个方便的功能。 但是如何在iPhone上查看已删除的浏览历史记录呢? 不用担心!在本文中,我们将列出 5 个经过验证的选项&a…

使用Apache Mahout制作 推荐引擎

目录 创建工程 基本概念 关键概念 基于用户与基于项目的分析 计算相似度的方法 协同过滤 基于内容的过滤 混合方法 创建一个推荐引擎 图书评分数据集 加载数据 从文件加载数据 从数据库加载数据 内存数据库 协同过滤 基于用户的过滤 基于项目的过滤 添加自定…

SpringMVC(六)拦截器

目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证(实例) 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…

【FlutterDart】 拖动边界线改变列宽并且有边界高亮和鼠标效果(12 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100) 【Flutter&Dart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小(11 /100) 上效果 对比一下vscode的效果&…

4.1.2 栈和队列(一)

文章目录 栈的定义栈的基本运算栈的存储结构栈的应用表达式求值 栈和队列的逻辑结构与线性表相同,但是其运算受到限制,统称为运算受限的线性表。 栈, 先进后出 队列,先进先出 栈的定义 栈顶,唯一能操作端 栈底&#xf…

如何理解RDD,以及RDD的五大特性和五大特点。

RDD:英文全称Resilient Distributed Dataset,叫做弹性分布式数据集,代表一个不可变、可分区、里面的元素可并行计算的分布式的抽象的数据集合。 Resilient弹性:RDD的数据可以存储在内存或者磁盘当中,RDD的数据可以分区…

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。   (3&a…

2000-2020年各省地区生产总值数据/各省gdp数据

2000-2020年各省地区生产总值数据/各省gdp数据 1、时间:2000-2020年 2、来源:国家统计局 3、指标:行政区划代码、地区、年份、地区生产总值 4、范围:31省 指标解释:地区生产总值(Regional GDP&#xf…

鸿蒙HarmonyOS开发:基于Swiper组件和自定义指示器实现多图片进度条轮播功能

文章目录 一、概述1、场景介绍2、技术选型 二、实现方案1、图片区域实现2、底部导航点设计3、手动切换 三、所有代码1、设置沉浸式2、外层Tabs效果3、ImageSwiper组件 四、效果展示 一、概述 在短视频平台上,经常可以见到多图片合集。它的特点是:由多张…

第二十八周学习周报

目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…

MCP(Model Context Protocol)模型上下文协议 进阶篇3 - 传输

MCP 目前定义了两种标准的客户端-服务端通信传输机制: stdio(标准输入输出通信)HTTP with Server-Sent Events (SSE)(HTTP 服务端发送事件) 客户端应尽可能支持 stdio。此外,客户端和服务端也可以以插件方…

NVIDIA DLI课程《NVIDIA NIM入门》——学习笔记

先看老师给的资料: NVIDIA NIM是 NVIDIA AI Enterprise 的一部分,是一套易于使用的预构建容器工具,目的是帮助企业客户在云、数据中心和工作站上安全、可靠地部署高性能的 AI 模型推理。这些预构建的容器支持从开源社区模型到 NVIDIA AI 基础…

物联网云平台:构建物联网生态的核心

我们常说的物联网,简称是IoT, 全称 Internet of Things。 用通俗的语言理解物联网,其实就是万事万物的互联网络。物联网概念也已经传播很多年了, 目前正在各行各业发挥力量。 要构建一个物联网生态, 我们首先想到的是智…

VS2022引入sqlite数据库交互

法一:用官网编译好的动态库(推荐) 下载所需文件 sqlite官网地址:https://www.sqlite.org/howtocompile.html 下载以下的2个压缩包 第一个压缩包 sqlite-amalgamation-xxxx.zip,xxxx是版本号,保持一致即可,这里面有sqite3.h 第…

设计模式学习[15]---适配器模式

文章目录 前言1.引例2.适配器模式2.1 对象适配器2.2 类适配器 总结 前言 这个模式其实在日常生活中有点常见,比如我们的手机取消了 3.5 m m 3.5mm 3.5mm的接口,只留下了一个 T y p e − C Type-C Type−C的接口,但是我现在有一个 3.5 m m 3.…

Markdown如何导出Html文件Markdown文件

Markdown如何导出Html文件Markdown文件 前言语法详解小结其他文章快来试试吧☺️ Markdown 导出 HTML 👈点击这里也可查看 前言 Markdown的源文件以md为后缀。Markdown是HTML语法的简化版本,它本身不带有任何样式信息。我们所看到的Markdown网页(如&…

Python安装(新手详细版)

前言 第一次接触Python,可能是爬虫或者是信息AI开发的小朋友,都说Python 语言简单,那么多学一些总是有好处的,下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录,并且遇到的问题也会写出&#xff0c…

JMeter + Grafana +InfluxDB性能监控 (二)

您可以通过JMeter、Grafana 和 InfluxDB来搭建一个炫酷的基于JMeter测试数据的性能测试监控平台。 下面,笔者详细介绍具体的搭建过程。 安装并配置InfluxDB 您可以从清华大学开源软件镜像站等获得InfluxDB的RPM包,这里笔者下载的是influxdb-1.8.0.x86_…