ElasticsearchES的工作原理可以高度概括为“分布式、倒排索引、近实时搜索”。1. 核心基石倒排索引Inverted Index这是ES搜索飞快的根本原因。不同于传统数据库正排索引ID - 内容倒排索引是内容 - ID。例子你有三篇文档。文档1苹果好吃文档2香蕉好吃文档3苹果营养倒排索引构建苹果- [文档1, 文档3]好吃- [文档1, 文档2]营养- [文档3]查询时当你搜索“苹果”ES直接命中索引瞬间返回文档1和3不需要扫描所有数据。2. 数据写入流程Index / WriteES写入并不是直接写磁盘而是走Memory Buffer - Filesystem Cache - Segment - Commit的路线这是它近实时Near Real-Time的关键。写入内存缓冲区Buffer数据到达时先写入Transaction Log防止宕机丢数据同时将原始JSON文档放入内存Buffer中此时数据不可被搜索。Refresh刷新默认每隔1秒ES会执行Refresh操作将Buffer中的数据冲刷到操作系统的文件缓存Filesystem Cache中并生成一个新的分段Segment。关键点此时数据已经可以搜索但尚未落盘Fsync。这就是ES被称为“近实时”延迟1秒的原因。Flush冲刷当Translog太大或每隔30分钟ES会执行Flush。将所有内存中的Segment刷入磁盘并清空Translog。此时数据才算真正持久化。3. 数据读取流程Search / ReadES的读取分为Query Phase查询阶段和Fetch Phase取回阶段且利用分片Shard并行工作。假设你有3个节点索引被分为2个主分片Primary和2个副本分片Replica。Query Phase协调节点Coordinating Node收到搜索请求会将请求广播给所有分片主或副本。每个分片在本地利用倒排索引找到匹配的文档ID但只返回文档ID和评分给协调节点。协调节点对全局所有ID进行合并排序。Fetch Phase协调节点根据排好序的ID列表再次请求各个分片获取文档的完整原始_source数据返回给客户端。4. 核心底层数据结构为了让倒排索引更快ES使用了以下核心编码技术FSTFinite State Transducer有限状态转换器用于存储词典Term Dictionary内存占用极小查询速度极快O(1)级别。跳跃表Skip List用于在多个Posting List文档ID列表之间快速求交集AND或并集OR。BKD Tree用于数值类型和地理位置的范围查询Range Query而非倒排索引。5. 分布式架构原理去中心化Master Node主节点只负责管理集群状态创建索引、分配分片不参与数据读写防止脑裂。数据节点Data Node负责存储数据和执行实际的搜索计算。路由算法当你写入一条数据时ES通过公式shard_num hash(_routing) % number_of_primary_shards决定该数据去哪个分片保证同一文档永远在固定分片方便查询时定位。6. 你必须要知道的“坑”面试重点删除不是真删除ES的删除只是给文档打上deleted标记在Segment Merge时才会物理清除所以频繁删除会导致性能下降。Segment是不可变的一旦写磁盘就永不改变。ES通过后台Merge进程将多个小Segment合并成大Segment释放被标记删除的空间这也是写性能高的原因没有锁竞争。一句话总结Elasticsearch 通过“倒排索引”实现快速匹配通过“内存Buffer 每秒Refresh”实现近实时搜索通过“分片 副本”实现高可用和水平扩展通过“Segment合并”实现后台异步持久化。