当前位置: 首页 > news >正文

ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?

正排索引解析

1.存储机制

Elasticsearch 的文档存储机制比简单的固定字节分配更复杂,其核心原理如下:

1. 数值类型存储机制
对于 long/float/double 等数值类型:
文档ID=2 → 偏移量 = 2 * sizeof(type)
例如:long 类型(8字节):
文档0偏移量:0
文档1偏移量:8
文档2偏移量:16 → 直接定位内存地址
2. 变长数据优化策略
字符串类型(keyword):
1. 字典编码:将字符串映射为整型ID"北京" → 0,"上海" →1
2. 文档存储整型ID(4字节)
3. 偏移量计算:文档ID * 4布尔类型:
使用位图存储(bit-packed):
文档0 → 0位
文档1 → 1位
每8个文档存储为1字节
3. 压缩机制
动态选择压缩策略:
数值序列 → 差值编码 + 位打包
稀疏数据 → 游程编码(RLE)
重复值 → 字典压缩

实际存储示例(文档ID=2的字段访问):

字段类型:long(固定8字节)
内存地址 = 列存储基地址 + (2 * 8)
直接读取该地址的8字节数据字段类型:keyword(字典编码)
1. 读取字典编码值:内存地址 = 基地址 + (2 * 4)
2. 通过字典表解码:0 → "北京"

2.寻址方式

正排索引的查询过程
定位到Stored Fields或Doc Values的过程

‌文档ID的使用‌:
在Elasticsearch中,每个文档都有一个唯一的文档ID。
当执行查询时,Elasticsearch会根据查询条件(如文档ID)在索引中查找对应的文档位置。
对于Stored Fields,Elasticsearch会维护一个文档ID到磁盘位置的映射表,通过这个映射表可以快速定位到存储该文档字段值的磁盘位置。
对于Doc Values,由于其采用列式存储,Elasticsearch会根据文档ID在相应的列中找到对应的字段值。

‌索引结构的支持‌:
Elasticsearch的索引结构包括倒排索引和正排索引。
倒排索引主要用于快速定位包含特定关键词的文档列表。
正排索引(如Doc Values和Stored Fields)则用于根据文档ID快速获取文档的字段值。
找到对应的Stored Fields或Doc Values后如何拿到想要的结果

‌读取数据‌:
一旦定位到Stored Fields或Doc Values中的位置,Elasticsearch就会从磁盘或内存中读取相应的数据。
对于Stored Fields,Elasticsearch会读取整个文档的字段值(如果只需要部分字段,可以在查询时指定)。
对于Doc Values,由于采用列式存储,Elasticsearch只会读取所需的字段列。
‌数据解压缩与转换‌(如适用):

如果数据在存储时进行了压缩,Elasticsearch会在读取后进行解压缩。
对于Doc Values,由于其设计目标之一就是高效存储和访问,因此解压缩过程通常非常快。
#‌### 返回结果‌:

最后,Elasticsearch将读取并可能解压缩后的数据作为查询结果返回给用户。
用户可以根据返回的结果进行进一步的处理或分析。

区别场景

倒排索引和正排索引是Elasticsearch中两种不同的数据结构,主要区别及适用场景如下:

一、核心区别
  1. 数据结构
  • 倒排索引:字典树的方式,方便搜索
  • 词项(term)→ 文档列表(posting list)
    "搜索" → [doc1, doc3, doc5]
    "引擎" → [doc2, doc5, doc8]
    
  • 正排索引:文档 → 字段值存储
    doc1 → {title: "搜索原理", content: "全文搜索技术..."}
    
  1. 存储内容
  • 倒排索引存储词项的词典(Term Dictionary)和倒排列表(Postings List)
  • 正排索引存储原始文档字段的完整值(Doc Values)
二、适用场景对比
特性倒排索引正排索引
核心用途文本搜索排序/聚合
查询效率毫秒级关键词匹配微秒级字段访问
存储消耗较高(存储分词和位置信息)较低(列式存储)
典型操作match、term 等查询sort、sum、avg 等聚合
数据更新需要重建索引支持实时更新
三、倒排索引适合全文搜索的原因
  1. 快速定位能力:通过分词器将文本分解为词元(token),建立词元到文档的映射关系,实现O(1)时间复杂度的词元查找

  2. 布尔运算优化:支持AND/OR/NOT逻辑运算

    "搜索 AND 引擎" → 对两个posting list求交集
    
  3. 相关性评分:内置TF-IDF/BM25算法,通过统计:

    • 词频(TF):词项在文档中出现的次数
    • 逆文档频率(IDF):词项在整个语料库中的稀有程度
    相关性得分 = TF * IDF
    
  4. 短语搜索:通过存储词项位置信息(position)实现精确短语匹配

    "机器学习" → 要求连续出现且顺序一致
    
四、典型应用场景
  1. 倒排索引适用场景:

    • 商品名称/描述的模糊搜索
    • 日志信息的错误关键词检索
    • 文档内容的相似性匹配
  2. 正排索引适用场景:

    • 商品价格的排序(sort by price)
    • 销售数据的统计聚合(sum total_sales)
    • 用户画像的标签过滤(filter by tags)
五、性能对比测试数据(基于ES 8.x)
操作倒排索引耗时正排索引耗时
10万条文本匹配12ms不支持
10万条数值范围查询45ms8ms
100万条结果排序120ms18ms

在实际应用中,Elasticsearch会同时维护两种索引结构,通过_source字段存储原始文档,doc_values维护正排索引,倒排索引用于搜索,两者协同工作实现高效查询。

http://www.xdnf.cn/news/572635.html

相关文章:

  • 目标检测基础知识
  • 使用 electron-builder 打包与发布 Electron 应用
  • Prometheus+Grafana实现对服务的监控
  • 黑色矩形大于6识别
  • RTMP协议解析【二】
  • RTMP协议解析[一]
  • lcd气压表研发方案芯片——用于胎压检测
  • Ubuntu 20.04安装及配置docker
  • 进程调度算法深度剖析:FCFS、SJF、RR、优先级及多级反馈队列全解
  • 算法第25天 | 491. 非递减子序列、46. 全排列、47. 全排列 II
  • Java 实现二进制与十进制之间的互相转换
  • 校平机的原理、应用及发展趋势
  • Vue3学习(Vue3.3新特性——defineModel宏详解)
  • OpenCv高阶(十六)——Fisherface人脸识别
  • MySQL 索引的增删改查
  • Docusaurus Umami
  • 算法优选系列(9.BFS 解决拓扑排序)
  • GStreamer (四)交叉编译
  • 华为eNSP无线AC/AP组网实战
  • 基于大模型的闭合性尺桡骨干骨折全方位诊疗研究报告
  • 现代计算机图形学Games101入门笔记(二十)
  • V少JS基础班之第五弹
  • ElasticSearch导读
  • 【网络安全】日志采集、监控任务守护进程详细教程(附实战案例)
  • 打卡31天
  • Python学习Day1:安装
  • 谷歌2025年I/O开发者大会热点总结
  • shell脚本总结3
  • 【LLMs篇】12:Qwen3 技术报告翻译
  • 人工智能路径:技术演进下的职业发展导航