热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解搜索引擎——索引技术解读

索引到底是什么?我们今天就来絮叨絮叨。从图中可发现,搜索加载超过1s就会直接影响页面放弃率,1s是用户的观感界限,所以搜索引擎的响应时间是需要着重优化的。然而无论是大搜还是垂搜,随

当你在搜索引擎的搜索框中输入你想查找的关键词后,首先影响你体验的并非是不相关的搜索结果,而是界面出现“loading”、“服务正在加载中”、“搜索响应失败”等字眼。据统计,搜索页面的加载时间会严重影响用户的搜索体验,进而丢失掉优质用户。如下图:

技术分享图片


索引到底是什么?我们今天就来絮叨絮叨。
从图中可发现,搜索加载超过1s就会直接影响页面放弃率,1s是用户的观感界限,所以搜索引擎的响应时间是需要着重优化的。然而无论是大搜还是垂搜,随着大数据时代的发展,被查询记录数都是数以亿计,甚至万亿计。搜索引擎是如何在大数据体量做到ms级返回的,这里就牵扯到索引的概念了。



?

先举个例子:

假如你是一位创业者,最开始你的公司只有10个打工人,某一天,你想找到其中几位有“销售经验”的人组建一销售团队,我相信你一个个询问、排除也很快能找出来的。这就是所谓的遍历查询

几个月后,你拿到了一笔投资,你的团队也从10个人扩充到了100个人,这个时候你想找有“运营经验”的员工组建运营团队,发现一个个询问有点力不从心了,于是你想了个办法,提前将100个人,分到10个部门,你想找各种经验的人,直接到对应的职能部门让部门经理找就可以。这就是搜索中的正排索引。如下图:


技术分享图片


后来随着公司的爆发式增长,你的公司现在有1w人了,部门已经是事业群了,组织架构也从之前的单层升级到多层,这时你想找到有“全栈经验”的开发工程师组建新的团队开发新的产品,发现把找人任务分下去后“疯了”,因为很有可能找完1w个人之后才能找到合适的人,这个时候你又想到一招,反过来思考,我既然最终要找的是人,那么我就以人为中心建立一套标准,先找到对应的人,再根据对应的人反推属于哪个部门,再让这个部门经理找自己团队还有没有符合要求的人,这样范围不是减小了很多吗?也大大提升了效率。这就是所谓的倒排索引

技术分享图片


【正排索引】

正排索引也叫正向索引(forward index),在蜘蛛爬取页面后,系统将页面标题、内容,经过文本预处理,可以得到独特的、能反应页面的主题内容、以词为单位的字符串。搜索引擎索引程序就可以提取关键词信息,包含出现次数,位置等,为该页面建立页面id与关键词的对应关系,而这个过程就叫做正排索引。

以例子来说明,现在有5篇关于“胡歌”的资讯,如下:

技术分享图片
根据5篇资讯的标题,建立正排索引如下:

技术分享图片



【倒排索引】

从上图可发现,此种方法结构比较简单,索引建立起来也比较方便,如果有文档添加时,直接按照此格式在后面添加索引块即可。如若需要删除,也指定id删除即可找到对应的所有信息直接删除即可。但是在查询的时候当你不知道你查询的内容的id是多少时,只能从1001扫描至1005,才能确保召回数没有遗漏,因此检索效率是及其低下

由于正排的查询效率实在太低,所以就有了倒排索引,也叫反向索引(inverted index)。在建立索引过程,将正排索引中的id对应的所有的关键词进行反转,建立一套以关键词为准的在哪个文档中出现过的索引,如下:

技术分享图片



【摘要索引】

由上图可知,如果要查询“猫”,只查询id为1003的文档即可,缩小了查询范围,提升了查询效率。倒排索引有着广泛的应用场景,比如:不仅用于搜索引擎、大规模数据库索引、文档检索、多媒体检索/信息检索领域等等。总之,倒排索引在检索领域是很重要的一种索引机制。

除此之外,还有摘要索引用于部分场景的搜索效率提升,摘要索引将文档所需返回展示的对应信息存储在一起,通过Doc_id可以定位该文档的存储位置,并获取对应的摘要信息,为用户提供摘要获取服务。摘要索引的结构和正排索引类似,但其功能不同,其结构如下:


技术分享图片


【分布式索引】

以上几种索引都是索引的结构,但仅仅使用这些索引结构进行优化是不够的,还需要在架构层面进行索引优化,既所谓的分布式索引,开源的solr和Elasticsearch都支持分布式索引,根据文档的id计算hash值,负载均衡将索引写入至对应的分片,以Elasticsearch为例,看下如下过程:

?


技术分享图片

?

Node-1和Node-2为ES集群的两个节点,根据不同的id值hash后 ,写入不同的节点。查询过程基于整个集群并行查询,提升查询效率。

现实中无论大搜还是垂搜,都使用了以上的索引结构及架构,大厂甚至部署了集群+集群的方式来支撑高并发,来实现高性能。但每个集群下每个节点都需要索引来支撑,所以效率是搜索的门户

?



技术分享图片

最后欢迎关注同名微信公众号:药老算法(yaolaosuanfa),带你领略搜索、推荐等数据挖掘算法魅力。


推荐阅读
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • 在 Mac 上查看隐藏文件和文件夹的详细指南。通过终端命令,您可以轻松地显示或隐藏这些文件。具体步骤如下:输入 `defaults write com.apple.finder AppleShowAllFiles -bool true` 以显示所有隐藏文件,或使用 `defaults write com.apple.finder AppleShowAllFiles -bool false` 以重新隐藏它们。此方法适用于各种版本的 macOS,帮助用户更好地管理和访问系统文件。 ... [详细]
  • 本文详细解析了逻辑运算符“与”(&&)和“或”(||)在编程中的应用。通过具体示例,如 `[dehua@teacher~]$[$(id -u) -eq 0] && echo "You are root" || echo "You must be root"`,展示了如何利用这些运算符进行条件判断和命令执行。此外,文章还探讨了这些运算符在不同编程语言中的实现和最佳实践,帮助读者更好地理解和运用逻辑运算符。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 在Conda环境中高效配置并安装PyTorch和TensorFlow GPU版的方法如下:首先,创建一个新的Conda环境以避免与基础环境发生冲突,例如使用 `conda create -n pytorch_gpu python=3.7` 命令。接着,激活该环境,确保所有依赖项都正确安装。此外,建议在安装过程中指定CUDA版本,以确保与GPU兼容性。通过这些步骤,可以确保PyTorch和TensorFlow GPU版的顺利安装和运行。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 题目 E. DeadLee:思维导图与拓扑结构的深度解析问题描述:给定 n 种食物,每种食物的数量由 wi 表示。同时,有 m 位朋友,每位朋友喜欢两种特定的食物 x 和 y。目标是通过合理分配食物,使尽可能多的朋友感到满意。本文将通过思维导图和拓扑排序的方法,对这一问题进行深入分析和求解。 ... [详细]
  • 深入解析Linux内核中的进程上下文切换机制
    在现代操作系统中,进程作为核心概念之一,负责管理和分配系统资源,如CPU和内存。深入了解Linux内核中的进程上下文切换机制,需要首先明确进程与程序的区别。进程是一个动态的执行流,而程序则是静态的数据和指令集合。进程上下文切换涉及保存当前进程的状态信息,并加载下一个进程的状态,以实现多任务处理。这一过程不仅影响系统的性能,还关系到资源的有效利用。通过分析Linux内核中的具体实现,可以更好地理解其背后的原理和技术细节。 ... [详细]
  • 如何在PDF文档中添加新的文本内容?
    在处理PDF文件时,有时需要向其中添加新的文本内容。这是否可以直接实现呢?有哪些简便且免费的方法可供选择?使用极速PDF阅读器打开文档后,可以通过点击左上角的“注释”按钮切换到注释模式,并选择相应的工具进行编辑。此外,还可以利用其他功能丰富的PDF编辑软件,如Adobe Acrobat DC或Foxit PhantomPDF,它们提供了更多高级的编辑选项,能够满足更复杂的需求。 ... [详细]
  • 题目要求解决一个有趣的编程挑战,即计算由四个自然数 \( p, q, r, s \) 组成的分数序列的和。具体来说,需要编写一个 C# 程序来处理这些自然数,并通过特定的数学运算得出最终结果。该任务不仅考验编程技能,还涉及对数学公式的理解和应用。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
author-avatar
过期物品请勿购_613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有