ElasticSearch(es)倒排索引
目录
一、ElasticSearch
二、倒排索引
1. 正向索引
2. 倒排索引
具体细节
1. 文档分析
2. 索引构建
3. 索引存储
4. 词条编码
5. 索引优化
6. 查询处理
示例
总结
3. 正向和倒排
三、总结
倒排索引的基本概念
为什么倒排索引快
一、ElasticSearch
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其 次是Apache Solr,也是基于Lucene
演示:京东,淘宝
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。
官网地址: https:// lucene.apache.org/
重要特性:
- 1、分布式的实时文件存储,每个字段都被索引并可被搜索
- 2、实时分析的分布式搜索引擎
- 3、可以扩展到上百台服务器,处理PB级结构化或非结构化数据
二、倒排索引
倒排索引的概念是基于MySQL这样的正向索引而言的。
1. 正向索引
那么什么是正向索引呢?例如给下表(tb_goods)中的id创建索引:
如果是根据id查询,那么直接走索引,查询速度非常快。
但如果是基于title做模糊查询,只能是逐行扫描数据,流程如下:
- 1)用户搜索数据,条件是title符合 "%手机%"
- 2)逐行获取数据,比如id为1的数据
- 3)判断数据中的title是否符合用户搜索条件
- 4)如果符合则放入结果集,不符合则丢弃。回到步骤1
逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。
2. 倒排索引
倒排索引中有两个非常重要的概念:
文档( Document ):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
词条( Term ):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理,流程如下:
- 将每一个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档id、位置等信息
- 因为词条唯一性,可以给词条创建索引,例如hash表结构索引
如图:
倒排索引的搜索流程如下(以搜索"华为手机"为例):
- 1)用户输入条件 "华为手机" 进行搜索。
- 2)对用户输入内容分词,得到词条: 华为 、 手机 。
- 3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。
- 4)拿着文档id到正向索引中查找具体文档。
如图:
虽然要先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。
具体细节
Elasticsearch 的底层原理涉及到多个层面,包括文档分析、索引构建、存储和查询处理等方面。下面详细解释这些方面的具体实现:
1. 文档分析
- 分析器(Analyzer): 当文档被索引时,它们会被传递给一个分析器,分析器负责将文档分解成一系列的词条(terms)。分析器通常包括分词器(Tokenizers)和过滤器(Token Filters)。
- 分词器: 将文本分割成单词或符号。
- 过滤器: 对分词结果进行处理,如大小写转换、去除停用词等。
2. 索引构建
- 词条(Terms): 从文档中提取出来的关键词。
- 文档ID(Document IDs): 每个文档都有一个唯一的ID。
- 倒排列表(Posting Lists): 对于每个词条,Elasticsearch维护了一个文档ID列表,其中包含了包含该词条的所有文档的ID。
3. 索引存储
Elasticsearch 使用 Lucene 作为其底层索引存储层。Lucene 使用倒排索引结构,主要包括以下几个组成部分:
- 词条字典(Terms Dictionary): 存储所有唯一词条的有序列表。
- 倒排文件(Postings File): 存储词条对应的文档ID列表。
- 频率文件(Frequency File): 存储每个词条在每个文档中的出现次数。
- 位置文件(Position File): 存储每个词条在文档中的位置信息,这对于短语查询非常重要。
4. 词条编码
词条在索引中通常是按照字典顺序排列的,以便快速定位。Lucene 使用多种编码技术来减少存储空间的需求,比如:
- 前缀编码(Prefix Coding): 利用词条间的相似性来减少存储需求。
- 可变字节编码(VByte Encoding): 一种用于整数编码的方法,可以有效地压缩文档ID列表。
- Gamma 编码: 用于编码整数的一种方式,特别适用于文档ID这样的非负整数。
5. 索引优化
- 合并(Merging): Lucene 会定期合并较小的索引片段,以减少碎片化。
- 缓存: Elasticsearch 使用多种缓存策略来加速查询,包括过滤器缓存(Filter Cache)、字段数据缓存(Field Data Cache)等。
- 段(Segments): Lucene 将索引划分为多个段,每个段是一个独立的倒排索引。这有助于减少锁的竞争,提高并发性能。
6. 查询处理
- 查询解析: 当用户提交查询时,Elasticsearch 首先解析查询,将其转换为 Lucene 可以理解的形式。
- 倒排列表获取: 根据查询中的词条,Elasticsearch 从索引中获取相应的倒排列表。
- 合并结果: 如果查询包含多个词条,则需要合并这些词条对应的文档ID列表。
- 评分与排序: 根据相关性评分算法对结果进行评分,并根据评分排序。
- 结果返回: 最终返回排序后的文档列表给用户。
示例
假设我们有两个文档:
- 文档1: "The quick brown fox jumps over the lazy dog."
- 文档2: "A quick movement of the enemy will jeopardize six gunboats."
对于词条 "quick",倒排列表将是
[1, 2],表示文档1和文档2都包含词条 "quick"。当用户搜索 "quick" 时,Elasticsearch:
- 查找词条 "quick" 的倒排列表
[1, 2]。- 返回包含这两个文档ID的结果集。
总结
通过上述机制,Elasticsearch 能够高效地处理各种复杂的全文搜索请求。索引构建时采用的分析器确保了文档能够被正确地拆解为词条,而倒排索引的设计则允许快速定位包含特定词条的文档集合。同时,通过多种优化技术和缓存策略,Elasticsearch 保证了高性能和高可用性。
3. 正向和倒排
那么为什么一个叫做正向索引,一个叫做倒排索引呢?
- 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
- 而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。
正向索引:
优点:
- 可以给多个字段创建索引
- 根据索引字段搜索、排序速度非常快
缺点:
- 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
倒排索引:
优点:
- 根据词条搜索、模糊搜索时,速度非常快
缺点:
- 只能给词条创建索引,而不是字段
- 无法根据字段做排序
三、总结
Elasticsearch (ES) 使用倒排索引来加速文本的搜索速度。倒排索引之所以高效,主要是因为它改变了数据的组织方式,使得查询操作可以快速完成。
倒排索引的基本概念
传统的正向索引是按照文档到词的方式存储的,即每个文档记录了它包含哪些词语。而倒排索引则反过来,它是按照词到文档的方式存储的,即每个词对应了包含该词的所有文档列表。
为什么倒排索引快
倒排索引之所以能够实现快速搜索,主要得益于以下几个方面:
减少扫描范围:
- 倒排索引将查询从文档到词的模式转变为词到文档的模式。这意味着当我们搜索一个词时,可以直接定位到包含这个词的所有文档,而无需遍历整个文档集合。
高效的数据结构:
- 词条按字典序排序,并且使用高效的数据结构(如跳表、B树等)来存储,这使得查找词条变得非常迅速。
- 倒排列表使用诸如可变字节编码、Gamma 编码等编码技术来压缩文档ID列表,减少存储空间的同时也提升了读取速度。
缓存机制:
- Elasticsearch 使用多种缓存机制,如过滤器缓存、字段数据缓存等,来缓存常用数据,从而避免频繁地从磁盘读取数据,显著提升查询性能。
并发处理:
- Elasticsearch 可以在多个节点上并行处理查询请求,利用集群中的多台机器来加速查询过程。
优化的搜索算法:
- Elasticsearch 使用高效的搜索算法来处理复杂的查询条件,例如使用布尔逻辑运算来组合不同的查询条件,以及利用跳表等数据结构来减少不必要的文档比较。
索引合并与优化:
- Lucene 会定期合并较小的索引片段,以减少碎片化,优化索引结构,从而提高查询效率。
内存映射:
- Elasticsearch 和 Lucene 会利用内存映射技术将索引文件映射到内存中,这使得数据可以直接在内存中操作,大大加快了访问速度。
综上所述,倒排索引的设计和实现通过减少不必要的数据访问、利用高效的数据结构和算法、优化存储格式以及利用缓存和并发处理等手段,实现了非常高的搜索性能。这些特性共同作用,使得Elasticsearch能够在大规模数据集中实现快速准确的全文搜索。
相关文章:
ElasticSearch(es)倒排索引
目录 一、ElasticSearch 二、倒排索引 1. 正向索引 2. 倒排索引 具体细节 1. 文档分析 2. 索引构建 3. 索引存储 4. 词条编码 5. 索引优化 6. 查询处理 示例 总结 3. 正向和倒排 三、总结 倒排索引的基本概念 为什么倒排索引快 一、ElasticSearch Elasticsear…...
【自然语言处理】概论(一):自然语言处理概要
1.1 概论:(一)自然语言处理概要 知识点 自然语言的定义:人类交流使用的,包括口语和书面语的信息交流方式。AI的终极目标:使计算机具备理解(听、读)和生成(说、写&#…...
flask 开始
# 导入flask类 from flask import Flask,request,render_template # 使用flask类来创建一个app对象 # __name__ 代表当前app.py 这个模块 app Flask(__name__) # 创建一个路由和视图函数的映射 url http://127.0.0.1:5000/ app.route("/") def hello_word():return …...
仕考网:公务员可以报考军队文职吗?
公务员可以报考军队文职考试,但是需要满足前提条件。 对于已经与国家、地方的用人单位建立劳动关系的社会人才,在获得当前用人单位的许可后才可以申请报考。 在面试过程中,考生必须出示一份由其用人单位出具的且加盖公章的同意报考证明。一…...
Java整理22
1、动态sql 多条件查询 .xml配置文件中sql语句书写<select id"getEmpByCondition",resultType"Emp">select * from t_emp where <if test"empName ! null and empName! ">empName#{empName}</if><if test"age ! nul…...
leetcode 408周赛 3234. 统计 1 显著的字符串的数量
3234. 统计 1 显著的字符串的数量 题目描述 给你一个二进制字符串 s。 请你统计并返回其中 1 显著 的子字符串的数量。 如果字符串中 1 的数量 大于或等于 0 的数量的 平方,则认为该字符串是一个 1 显著 的字符串 。 思路 一个很显然的思路是,我们…...
容器对比虚拟机有哪些不足?
引言 在当今的云计算和微服务架构中,容器技术已成为不可或缺的一部分。它以其轻量级、高效和快速部署的特性,赢得了广大开发者和运维人员的青睐。然而,正如任何技术都有其两面性,容器技术也不例外。本文将对容器技术在安全性、隔离…...
C# 归并排序
栏目总目录 概念 归并排序是一种分而治之的排序算法。它将一个大数组分成两个小数组,递归地对这两个小数组进行排序,然后将排序好的小数组合并成一个有序的大数组。这个过程一直递归进行,直到数组被拆分成只有一个元素的数组(自然…...
【请求代理】springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能
springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能 一、前言二、解决思路三、基于gateway实现四、基于过滤器Filter实现五、问题总结 **注:本文源码获取或者更多资料,关注公众号:技术闲人**一、前言 在项目开发时会遇到w…...
.NET Core异步编程与多线程解析:提升性能与响应能力的关键技术
在.NET Core中,异步编程和多线程是构建高性能应用程序的核心技能。理解这两个概念不仅可以提升应用程序的响应能力,还能优化资源使用。本文将深入剖析异步编程和多线程的关键知识点,提供代码示例,并附上步骤以帮助理解。 1. 异步…...
Photoshop(PS) 抠图简单教程
目录 快速选择 魔棒 钢笔 橡皮擦 蒙版 通道 小结 可以发现,ps逐渐成为必备基础的办公软件。本文让ps新手轻松学会抠图。 快速选择 在抠图之前,先了解下选区的概念。ps中大多数的抠图操作都是基于选区的,先选区再Ctrl J提取选区。而快…...
项目管理中的常用工件(二):可视化工件
项目管理中的常用工件(二):可视化工件 亲和图(affinity diagram)因果图(cause-and-effect diagram)直方图(histogram)流程图(flowchart)散点图&am…...
Git入门与实战:版本控制的艺术
🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 微信:zsqtcyw 联系我领取学习资料 …...
[Mysql-DML数据操作语句]
目录 数据增加:INSERT 全字段插入: 部分字段插入: 一次性添加多条: 数据修改:UPDATE 数据删除:DELECT delete truncate drop 区别 数据增加:INSERT 总体格式:insert into 表…...
Tableau入门|数据可视化与仪表盘搭建
原视频链接(up:戴戴戴师兄),文章为笔者的自学笔记,用于复习回顾,原视频下方有原up整理的笔记,更加直观便捷。因为视频中间涉及的细节较多,建议一边操作,一边学习。 整体介绍 可视化…...
API 技术开发分享:连接电商平台数据获取的桥梁
在当今数字化的时代,API(Application Programming Interface,应用程序编程接口)技术成为了实现不同系统之间通信和数据交换的关键。它就像是一座无形的桥梁,使得各种应用能够相互协作,共享资源,…...
区块链如何助力数字版权保护和内容创作者的权益?
区块链技术可以助力数字版权保护和内容创作者的权益,主要有以下几个方面: 去中心化的版权登记和溯源:区块链可作为一个可信的去中心化数据库,记录并验证数字内容的版权信息。内容创作者可以将自己的作品信息存储在区块链上&#x…...
记一次老旧项目的整体技术升级
最近给公司采购的老旧的 node8 vue2.6 webpack3 npm 项目做构建优化 背景:整个项目 build 一次 20 min ,本地冷启动和热更新也忒慢,依赖 npm i 一下也得装个 20 min 众所周知,Node 版本,依赖包管理工具 和 构建工…...
2024年最受欢迎的五大上网审计设备和软件
在2024年的市场上,上网行为审计设备和软件种类繁多,它们帮助企业监控和管理员工的网络活动,确保网络安全并提高工作效率。下面是一些受欢迎的上网行为审计设备和软件。 2024年最受欢迎的上网行为审计设备和软件如下 1.安企神软件:…...
sed利用脚本处理文件
一、sed是什么 sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编 辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 二、sed的原理 读入新的一行内容到缓存空间; 从指定的操作指令中取出第一条指令&…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...


