分布式搜索系统的设计

news2024/10/7 12:19:24

介绍

如今,我们几乎在每个网站上都看到一个搜索栏。搜索栏使我们能够快速找到我们需要的内容。

让我们举个例子。想象一下,如果YouTube没有提供搜索栏,我们如何在数百万个视频中找到特定的视频,这些视频多年来都已上传到YouTube?用户仅通过滚动浏览很难找到他们想要的内容。

在每个搜索栏背后,都有一个搜索系统。

需求

可用性:系统应对用户高度可用。•可扩展性:系统应能够随着数据量的增加而扩展。换句话说,它应能够索引大量数据。•快速搜索大数据:无论用户搜索多少内容,他们都应该能够快速获取结果。

核心概念

倒排索引

索引 — 是组织和操作数据的过程,旨在促进快速和准确的信息检索。

倒排索引 — 是一种类似于哈希映射的数据结构,它使用文档-词术矩阵。它不是将完整文档存储,而是将文档拆分为单个词语。然后,文档-词术矩阵识别唯一的词语,并丢弃频繁出现的词语,如“to”、“they”、“the”、“is”等等。

9e2fd50226c53a8109db363396a49ced.png
 

图1.0:倒排索引

“映射”列中的每个条目都包括三个列表:

•词语出现的文档列表。•统计词语在每个文档中出现的频率的列表。•指出词语在每个文档中的位置二维列表。一个词语可以在同一文档中出现多次,因此使用二维列表。

对于提取的每个词语,我们要么在倒排索引中添加新行,要么在该词语已经在倒排索引中有条目的情况下更新现有条目。同样,在删除文档时,我们需要处理,找到已删除文档词汇在倒排索引中的条目,然后相应地更新倒排索引。

设计

在添加文档或运行搜索查询时,需要将倒排索引加载到主内存中。为了效率,必须将倒排索引的大部分内容适应于机器的RAM中。

这意味着我们必须将大量数据加载到RAM中。不是增加单台机器的资源来索引十亿页,而是要转向分布式系统,利用并行化的力量

698b165fe61ef0278eb94f18cd1a668c.png
 

图2.0:分布式搜索系统的高级设计

索引器从分布式存储中获取文档,并使用MapReduce进行索引,MapReduce运行在分布式的普通机器集群上。索引器使用分布式数据处理系统(例如MapReduce)进行并行和分布式索引构建。构建的索引表存储在分布式存储中。•使用分布式存储来存储文档和索引。•用户在搜索栏中输入包含多个词语的搜索字符串。•搜索器解析搜索字符串,从存储在分布式存储中的索引中搜索映射,并将最匹配的结果返回给用户。

数据分区

为了实现成本效益,我们在索引中使用了众多小节点。这个过程要求我们对输入数据(文档)进行分区或拆分

c7952e71c7d535d1ac2ba2d7085fea5a.png
 

图3.0:在多个普通机器集群中以并行方式进行分布式索引和搜索

索引

集群管理器将输入文档集分成N个分区,其中N等于上图中的2。每个分区的大小由集群管理器决定,考虑到数据的大小、计算、内存限制和集群中的节点数量。由于各种原因,可能不是所有节点都可用。集群管理器通过定期心跳监视每个节点的健康状况。要将文档分配给N个分区之一,可以使用哈希函数。•分区后,集群管理器在集群中的N个节点上同时运行所有N个分区的索引算法。每个索引过程都会生成一个小型的倒排索引,存储在节点的本地存储中。这样,我们生成了N个小型倒排索引,而不是一个大的倒排索引。

搜索

•在搜索阶段,当用户查询进来时,我们在存储在节点本地存储中的每个小型倒排索引上运行并行搜索,生成N个查询。•每个小型倒排索引的搜索结果都是与查询词语匹配的映射列表(我们假设用户查询是单个词语/术语)。合并器聚合这些映射列表。•在

聚合映射列表后,合并器根据每个文档中词语的频率对文档列表进行排序。

•排序后的文档列表以升序顺序返回给用户。

复制

我们为生成分配分区的索引节点创建副本。

通常,三个副本足够。三个副本意味着三个节点托管相同的分区并生成索引。三个节点中的一个成为主节点,而其他两个是副本。同一分区将转发到所有三个副本。我们假设每个副本都会独立计算索引,这会导致资源的低效使用。与在副本上重新计算索引不同,我们只在主节点上计算倒排索引。接下来,我们将倒排索引(二进制文件)传输到副本。这种方法的主要好处是避免了在副本上使用重复的CPU和内存来进行索引。

4ed18e9ab0314f07fb51da9059e258e5.png
 

图4.0:由索引节点生成的索引存储在分布式存储中,参与搜索的节点从分布式存储中读取索引以为用户的查询生成结果

索引和搜索之间有很强的分离,而没有索引延迟的负面影响。由于这种分离,索引不会影响搜索可扩展性,反之亦然。此外,与在副本上重新计算索引不同,我们只需复制索引文件。

在硬件故障的情况下,会添加新的搜索器或索引器机器,并从分布式存储中检索数据的副本。

评估

可用性

数据在分布式存储中跨多个区域进行复制,使索引和搜索的跨区域部署更加容易。因此,如果一个地方发生故障,我们可以在另一个集群中处理请求。

索引是离线执行的,不在用户的关键路径上。我们不需要同步复制索引操作。无需在将新索引复制到响应搜索查询之前等待。这使得搜索对用户可用。

可扩展性

分区是搜索系统扩展的重要组成部分。当增加分区的数量并向索引和搜索集群添加更多节点时,可以在数据索引和查询方面实现扩展。

索引和搜索过程之间的强分离有助于索引和搜索独立和动态地扩展。

大数据快速搜索

我们利用了多个节点,每个节点在较小的倒排索引上并行执行搜索查询。然后,将每个搜索节点的结果合并并返回给用户。

9c6ee6f425f21fbdb88df44685d856ee.jpeg815799a4d644f88b081a89d73a8cab99.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【git merge/rebase】详解合并代码、解决冲突

目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 1.概述 在实际开发中,一个项目往往是多个人一起协作的,头天下班前大家把代码交到远端仓库,第二天工作的第一件事情都是从服务器上拉最新的代码,保证代码版本…

【pytorch】模型的保存与加载|| Dataloader数据加载器

Pytorch模型保存与加载,并在加载的模型基础上继续训练 系统学习Pytorch笔记三:Pytorch数据读取机制(DataLoader)与图像预处理模块(transforms) 一、只保存参数 1. 保存 一般地,采用一条语句即可保存参数: torch.save(model.s…

UI设计师岗位的基本职责八篇

UI设计师岗位的基本职责1 职责: 1. 负责公司互联网产品app、web、h5等的用户界面设计工作; 2. 负责运营活动相关的平面及视频设计支持; 3. 负责完成产品相关的界面、图标、动画等的图形界面设计,并参与制定、编写产品视觉设计规范文档; 4. 整理和分…

解决yolo无法指定显卡的问题,实测v5、v7、v8有效

方法1 基本上这个就能解决了!!! 在train.py的最上方加上下面这两行,注意是最上面,其次指定的就是你要使用的显卡 import os os.environ[CUDA_VISIBLE_DEVICES]6方法2: **问题:**命令行参数指…

数字化营销系统有什么优势?免费数字化营销系统推荐

数字化营销系统的优势在于其多方面的性能。首先,它可以帮助企业降低成本,其次,数字化营销系统还能提高市场推广收益情况的跟踪能力。通过精准定位和智能推荐,企业可以将信息传递给更有可能转化为实际购买力的潜在客户。如蚓链数字…

java加密使用

加解密 概念算法分类对称加解密算法非对称加解密算法信息摘要算法 数字签名和消息验签数字签名过程消息验签过程数字签名分类 AES使用生成秘钥使用秘钥加解密 RSA使用生成公私钥加密、加签、验签、解密 SM2使用将公钥和私钥证书文件转化为字符串存储 概念 算法分类 对称加解密…

Qt编程-QTableView冻结行或冻结列或冻结局部单元格

前言 Qt编程-QTableView冻结行或冻结列或冻结局部单元格。如题,先看效果是不是你需要的。网上找到的代码片段要么不全要么不是想要的。如果你需要同时冻结行和列的效果,请看下篇博客 Qt编程-QTableView同时冻结行和列。 冻结列: 冻结行&a…

[stm32]外中断控制灯光

在STM32CubeMX中配置外部中断功能和参数 1、将上拉输入的引脚设置为:GPIO_EXTI功能 2、GPIO模式设为下降沿触发外部中断,使能上拉电阻,用户标签 3、要将NVIC的相关中断勾选 只有将中断源进行勾选,相关的中断请求才能得到内核的…

华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一)

华为云云耀云服务器L实例评测|企业项目最佳实践系列: 华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测|企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

Hudi第三章:集成Flink

系列文章目录 Hudi第一章:编译安装 Hudi第二章:集成Spark Hudi第二章:集成Spark(二) Hudi第三章:集成Flink 文章目录 系列文章目录前言一、环境准备1.上传并解压2.修改配置文件3.拷贝jar包4.启动sql-client1.启动hadoop2.启动ses…

2023年中国助消化药物行业现状分析:消化不良患者逐年上升,提升需求量[图]

助消化药物主要分为促胃动力药物、消化酶抑制剂、胃酸抑制药物和消食剂4种类型。促胃动力药物的作用机制是通过增强胃肠道平滑肌动力促进胃酸分泌,从而达到助消化的目的,临床常用药物包括多潘立酮、莫沙必利、西沙比利等。 助消化药物分类 资料来源&…

SI314兼容替代 GTX314L—低功耗14通道电容触摸传感器芯片 应用智能门锁

1.介绍 Si314是一款具有自动灵敏度校准功能的14通道电容传感器,其工作电压范围为1.8~5.5v.Si314设置休眠模式来节省功耗,此时,功耗电流为10uA3. 3V。 Si314各个感应通道可实现独立使能、校准、灵敏度调节,可以确保可靠性&#x…

一款好用的PDF文档解密软件

PDF Decrypter pro 纯免费,没有页数限制,没有额外水印,强烈推荐!

使用docker创建redis实例、主从复制、哨兵集群

单机模式 1 拉取镜像 docker pull redis:7.2.1 2 新建redis映射配置文件夹data和conf $ mkdir -p /mydata/redis/data $ mkdir -p /mydata/redis/conf 3 切换到redis配置文件映射目录/mydata/redis/conf cd /mydata/redis/conf 4 编辑配置文件 vim redis.…

算法题:单调递增的数字(贪心算法解决序列问题)

这道题参考了一位网友的思路&#xff0c;采用了贪心算法动态规划&#xff0c;具体思路如下&#xff1a;&#xff08;完整题目附在了最后面&#xff09; 1、从高到低遍历数字的每个位数&#xff0c;找到第一个数值递减&#xff08;<&#xff09;的地方&#xff0c;把当前位-…

[spring] spring jpa - hibernate 名词解释配置

[spring] spring jpa - hibernate 名词解释&配置 之前过了一遍依赖注入的内容&#xff0c;这次过一下数据相关的部分&#xff0c;完成了这部分内容&#xff0c;下篇就涉及到 API 实现了 操作的部分放到下一篇&#xff0c;本篇主要是概念配置 整体课程上来说&#xff0c;…

c++ pthread库使用

c pthread库使用 1. pthread库安装2. 测试demo3. 配置include/lib路径3.1 添加include路径3.2 配置lib文件路径 4.显示结果5. 遇到的bug参考文献 1. pthread库安装 打开ftp://sourceware.org/pub/pthreads-win32&#xff0c;下载一个安装包&#xff0c;如pthreads-w32-2-8-0-r…

STM32 CubeMX PWM三种模式(HAL库)

STM32 CubeMX PWM两种模式&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX PWM两种模式&#xff08;HAL库&#xff09;一、互补对称输出STM32 CubeMX设置代码部分 二、带死区互补模式STM32 CubeMX设置代码 三、普通模式STM32 CubeMX设置代码部分 总结 一、互补对称输…

实现Java基于类的代理方式 - CGLIB动态代理(动态代理篇 三)

CGLIB&#xff08;Code Generation Library&#xff09;是一个基于类的动态代理库&#xff0c;它可以在运行时生成字节码来创建代理类。相比于JDK动态代理&#xff0c;CGLIB动态代理不需要接口&#xff0c;可以代理任意类。 CGLIB动态代理的实现原理是通过继承目标类来创建代理…

什么是网络流量监控

随着许多服务迁移到云&#xff0c;网络基础架构的维护变得复杂。虽然云采用在生产力方面是有利的&#xff0c;但它也可能让位于未经授权的访问&#xff0c;使 IT 系统容易受到安全攻击。 为了确保其网络的安全性和平稳的性能&#xff0c;IT 管理员需要监控用户访问的每个链接以…