Lucene底层原理:倒排索引实现原理与代码实战,彻底吃透搜索引擎核心
Lucene底层原理倒排索引实现原理与代码实战彻底吃透搜索引擎核心前言一、什么是倒排索引1.1 正排索引数据库索引1.2 倒排索引搜索引擎索引1.3 核心结构二、倒排索引完整结构2.1 示例三、Lucene 倒排索引构建完整流程底层真实流程3.1 构建步骤图文版3.2 构建流程图四、Lucene 倒排索引检索流程4.1 查询流程4.2 为什么这么快五、手写实现极简版倒排索引Java 代码5.1 代码实现5.2 运行结果六、Lucene 倒排索引真实底层存储格式七、Lucene 倒排索引的核心优化ES 高性能的秘密7.1 Term Index 基于 FST 结构7.2 Posting List 压缩算法7.3 有序倒排表7.4 段Segment不可变八、倒排索引核心总结面试必背九、本文总结The Begin点点关注收藏不迷路前言倒排索引Inverted Index是 Lucene 和 Elasticsearch 的灵魂是全文检索能做到秒级响应的核心数据结构。几乎所有搜索引擎、大数据检索组件底层都依赖倒排索引。但绝大多数开发者只知其名不知其实现。本文从原理 → 结构 → 构建流程 → 代码实现 → 检索流程用最通俗的方式带你从零实现 Lucene 倒排索引彻底搞懂 ES 为什么快。一、什么是倒排索引1.1 正排索引数据库索引文档ID → 单词列表需要遍历所有文档才能查关键词慢。1.2 倒排索引搜索引擎索引单词 → 文档ID列表倒排表通过关键词直接定位文档极快。1.3 核心结构Term词项分词后的最小单元关键词Posting List倒排表包含这个词的文档ID集合Term Dictionary词词典Term 的排序集合Term Index词项索引对 Term Dictionary 的索引加速查找二、倒排索引完整结构Term Index (单词索引) ↓ Term Dictionary (单词词典排序、二分查找) ↓ Posting List (倒排表文档ID列表、频率、位置)2.1 示例文档1我爱Java2Java编程3编程学习倒排索引Java → [1, 2] 编程 → [2, 3] 我爱 → [1] 学习 → [3]三、Lucene 倒排索引构建完整流程底层真实流程3.1 构建步骤图文版文档采集读取原始文档内容分词Analyzer将文本切分成 Term词项处理转小写、去停用词、归一化建立映射Term → 文档ID、词频、位置写入内存缓冲区生成段文件Segment持久化到磁盘3.2 构建流程图原始文档分词器Analyzer生成Term词项建立Term→DocID映射写入内存缓冲区生成倒排索引段Segment写入磁盘可检索四、Lucene 倒排索引检索流程4.1 查询流程输入查询关键词分词生成 Term通过Term Index快速定位在Term Dictionary二分查找获取Posting List取文档ID → 返回结果4.2 为什么这么快Term Index 放在内存O(1) 定位Term Dictionary 有序二分查找 O(logN)Posting List 压缩存储IO 极小五、手写实现极简版倒排索引Java 代码下面用100 行 Java 代码实现一个迷你 Lucene 倒排索引包含分词索引构建关键词检索5.1 代码实现importjava.util.*;/** * 极简倒排索引实现 */publicclassInvertedIndex{// 倒排索引核心结构Term - 文档ID集合privatefinalMapString,SetIntegerindexnewHashMap();// 新增文档构建索引publicvoidaddDocument(intdocId,Stringcontent){// 1. 分词简单按空格分词String[]termscontent.split( );for(Stringterm:terms){termterm.toLowerCase();// 统一小写// 2. 创建倒排项index.computeIfAbsent(term,k-newHashSet()).add(docId);}}// 关键词检索publicSetIntegersearch(Stringkeyword){returnindex.getOrDefault(keyword.toLowerCase(),Collections.emptySet());}// 测试publicstaticvoidmain(String[]args){InvertedIndexindexnewInvertedIndex();// 添加文档index.addDocument(1,I love Java);index.addDocument(2,Java programming);index.addDocument(3,programming study);// 查询System.out.println(index.search(Java));// [1,2]System.out.println(index.search(programming));// [2,3]}}5.2 运行结果[1, 2] [2, 3]这就是 Lucene 倒排索引最核心的原理六、Lucene 倒排索引真实底层存储格式Lucene 会把倒排索引存储为.tim、.tip、.doc、.pos等文件文件作用.tipTerm Index内存索引.timTerm Dictionary词词典.docPosting List文档ID列表.pos词项位置.pay有效载荷七、Lucene 倒排索引的核心优化ES 高性能的秘密7.1 Term Index 基于 FST 结构内存占用极小极高检索效率支持前缀匹配7.2 Posting List 压缩算法FOR 压缩PFOR 压缩空间减少 80%7.3 有序倒排表快速求交、合并、求并加速多条件查询7.4 段Segment不可变无锁高并发检索极快八、倒排索引核心总结面试必背倒排索引 Term Term Dictionary Posting ListLucene 使用 FST 构建 Term IndexPosting List 存储文档ID、词频、位置查询 词项查找 倒排表取文档段文件不可变高性能基石九、本文总结倒排索引是搜索引擎的核心Lucene 作为 ES 底层通过分词倒排映射FST 索引压缩存储段不可变实现了海量数据下的毫秒级检索。理解倒排索引你就真正理解了 Elasticsearch 为什么是世界上最快的搜索引擎。The End点点关注收藏不迷路