ES 的倒排索引

目录

什么是 elasticSearch。

什么是倒排索引

Term Index 是什么

Stored Fields 是什么

Doc Values 是什么

segment

lucene 是什么

高性能

高扩展性

高可用

Node 角色分化

去中心化

ES 是什么?

ES 和 Kafka 的架构差异

ES 的写入流程

ES 的搜索流程

查询阶段。

获取阶段。

总结


来源:ES 的倒排索引


现在有三段文本,id 分别是 0、1、2,你需要快速找到哪段文本里含有关键词"xiaobai".

I like xiaobai        (点赞)
I follow xiaobai      (关注)
I forward the video   (转发)

我们很容易想到,可以依次遍历这三段文本,匹配文本内是否含有"xiaobai",最终将符合条件的文本 ID 输出。
数据量小的时候,问题不大,但如果我有上百亿条这样的数据呢?
如果依次遍历,这一把执行下去,比你喜欢的女生回你消息的速度,还要
像这种在海量数据中,通过关键词检索出有效信息的场景非常常见,比如我们网购用的某宝和某东的站内商品搜索。那么问题就来了,怎么处理类似的搜索场景呢?
好办,没有什么是加一层中间层不能解决的,如果有,那就再加一层
这次我们要加的中间层是 elasticSearch

图片

什么是 elasticSearch。

elastic Search, 也就是 es,是一个开源的搜索引擎。
它介于应用数据之间,只要将数据写入 es,应用就可以通过一些关键词搜索到数据。效果就像某度搜索一样。
那它是怎么做到的呢?我们从倒排索引聊起。

什么是倒排索引

回到文章开头的例子。依次遍历文本匹配是否含有"xiaobai",确实低效。那有更高效的解法吗?有,我们可以对文本进行切分,比如"I like xiaobai"切分为"I"、"like"、"xiaobai"三部分,这个操作叫分词,分词后的每部分,我们称为一个词项,也就是 term。记录词项和文本 id 的关系,于是上面的三段文本就变成了下面这样。

图片

term

文本 id
I 0, 1, 2
like 0
xiaobai 0, 1
follow 1
forward 2
the 2
video 2

当我们想要搜索 xiaobai 的时候,只需要匹配到 xiaobai 词项,就可以立马得到它所在的文档 id 是 0 和 1。但这有个问题,短短三句话,就已经有这么多词项了,要是换成三篇文档,那词项就会多得离谱,怎么在这么多的词项里匹配出 xiaobai 呢?挨个遍历的话,时间复杂度就是 O(N), 太低效了。

怎么办呢?我们可以将词项按字典序从小到大排序,通过二分查找的方法,直接将时间复杂度优化为 O(lgN)。就像下面这样。

term 文档 id
follow 1
forward 2
I 0, 1, 2
like 0
the 2
video 2
xiaobai 0, 1

我们将这堆排好序的词项,称为Term Dictionary,而词项对应的文档 id 等信息的集合,就叫 Posting List。它们共同构成了一个用于搜索的数据结构,它就是**倒排索引(Inverted Index)**。

图片

注意,Posting List 其实还包含词频词项在文本里的偏移量等信息,但为了方便理解,我在上图中去掉了这部分内容。

但倒排索引还有个问题,Term Dictionary 数据量很大,放内存并不现实,因此必须放在磁盘中。但查询磁盘是个较慢的过程。有优化手段吗?有,我们聊下 Term Index

Term Index 是什么

我们可以发现,词项和词项之间,有些前缀是一致的,比如 follow 和 forward 前面的 fo 是一致的,如果我们将部分 term 前缀提取出来,像下图一样,就可以用更少的空间表达更多的 term。基于这个原理,我们可以将 Term Dictionary 的部分词项提取出来

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

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

相关文章

微服务电商平台课程六:后端代码框架认识

本地环境搭建好,大家可以进行调试,并能够修改其中代码。 后端技术栈 Spring Boot是伴随着Spring4.0共同诞生的,它的目的就是简化spring的配置及开发,并协助开发人员可以整体管理应用程序的配置而不再像以前那样需要做大量的配置工作,它提供了很多开发组件,并且内嵌了we…

Unity教程(二十)战斗系统 角色反击

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

Garnet:微软官方基于.Net 8开源缓存系统,可无需任何改动直接替代Redis,而且还更高性能!

近日微软官方开源了一个开源缓存系统,可完全替代Redis。 01 项目简介 Garnet是微软官方基于.Net 8开发的、开源高性能远程缓存存储系统,支持单节点、集群。 Garnet使用的是当前流行的 RESP 协议,使得当前大多数编程语言现成的 Redis 客户端…

java项目之网上点餐系统源码(springboot+mysql+vue)

大家好我是风歌,曾担任某大厂java架构师,如今专注java毕设领域。今天要和大家聊的是一款基于springboot的网上点餐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 网上点餐系统的主要使用者分为管理员登录…

深入Android架构(从线程到AIDL)_23 活用IBinder接口于近程通信01

1、 在同一进程里活用IBinder接口 议题 1. myActivity对象是谁创建的呢? 2. myService对象是谁创建的呢? 3. 当myService类里有个f1()函数,如何去调用它呢? 4. 必须先取得myService对象的指针,才能调用f1()函数去存取对象的属性(Attribute)值。 …

拥抱HarmonyOS之高效使用DevEco

拥抱HarmonyOS之高效使用DevEco 前半年对公司的IM SDK进行了鸿蒙化,半年过去系统已经伴随APP上线应用市场,总结一些适配过程中的经验技巧,希望对大家有用。 1.应用AI翻译代码 IM SDK和普通应用的最大差异是逻辑性代码比较多,使…

RT-DETR代码详解(官方pytorch版)——参数配置(1)

前言 RT-DETR虽然是DETR系列,但是它的代码结构和之前的DETR系列代码不一样。 它是通过很多的yaml文件进行参数配置,和之前在train.py的parser argparse.ArgumentParser()去配置所有参数不同,所以刚开始不熟悉代码的时候可能不知道在哪儿修…

Halcon在linux及ARM上的安装及c++工程化

一、HALCON下载 建议到HALCON官方下载页选择linux版本下载,压缩包名为MVTec_HALCON_Progress-18.11.0.1-linux(x64-aarch64-armv7a)-FullVersion.tar.gz。下载前需要登录HALCON帐号,如果没有请自行注册,填写一些基本信息然后激活邮件,操作方便简易。 下载许可证文件 该许…

单通道串口服务器(三格电子)

一、产品介绍 1.1 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通 串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口,两个接口内部连接,同 时只能使用一个口工作。 设 备 的网 口…

Figma如何装中文字体-PingFang苹方字体、Alibaba PuHuiTi阿里普惠

**写在前面: 工具类软件更新迭代如此快的世界,不能靠历史知识来做操作反应。需要着眼于当下工具的形态来思考用法。另外,有人说,当前的用户越来越少发教程类的图文消息了(转去了视频),现在很多…

JVM实战—13.OOM的生产案例

大纲 1.每秒仅上百请求的系统为何会OOM(RPC超时时间设置过长导致QPS翻几倍) 2.Jetty服务器的NIO机制如何导致堆外内存溢出(S区太小 禁NIO的显式GC) 3.一次微服务架构下的RPC调用引发的OOM故障排查实践(MAT案例) 4.一次没有WHERE条件的SQL语句引发的OOM问题排查实践(使用MA…

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片,从而节省时间和精力,提高工作效率。批处理功能特别适用于需要批量处理的任务,如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

【物联网原理与运用】知识点总结(上)

目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性(五大功能域) 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …

新车月交付突破2万辆!小鹏汽车“激活”智驾之困待解

首次突破月交付2万辆规模的小鹏汽车,稳吗? 本周,高工智能汽车研究院发布的最新监测数据显示,2024年11月,小鹏汽车在国内市场(不含出口)交付量(上险口径,下同&#xff09…

基于Springboot+Vue的仓库管理系统

开发一个基于Spring Boot和Vue的仓库管理系统涉及到前端和后端的开发。本文呢,给出一个简单的开发步骤指南,用于指导初入的新手小白如何开始构建这样一个系统,如果**你想直接学习全部内容,可以直接拉到文末哦。** 开始之前呢给小…

java项目之ONLY在线商城系统设计与实现源码(springboot+vue+mysql)

大家好我是风歌,曾担任某大厂java架构师,如今专注java毕设领域。今天要和大家聊的是一款基于springboot的ONLY在线商城系统设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: ONLY在线商城系统设计与实…

java后端对接飞书登陆

java后端对接飞书登陆 项目要求对接第三方登陆,飞书登陆,次笔记仅针对java后端,在看本笔记前,默认已在飞书开发方已建立了应用,并获取到了appid和appsecret。后端要做的其实很简单,基本都是前端做的&…

【2025最新计算机毕业设计】基于SpringBoot+Vue奶茶点单系统(高质量源码,提供文档,免费部署到本地)

作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

import语句详解

在 Java 中,import 语句用于引入其他包中的类、接口或静态成员,以便在当前源文件中直接使用它们,而不需要写完整的类名(包括包名)。以下是 import 语句的详细解释和使用方法: 一、import语句的基本概念 定…

android刷机

android ota和img包下载地址: https://developers.google.com/android/images?hlzh-cn android启动过程 线刷 格式:ota格式 模式:recovery 优点:方便、简单,刷机方法通用,不会破坏手机底层数据&#xff0…