一、lucene的组成
segment是一个具备完整搜索功能的最小单元。
多个segment组成了一个单机文本检索库lucene。
- inverted index:倒排索引,用于快速根据关键词找到对应的文章
- term index: 构建出关键词的目录树,解决了term dictionary数据量过大,无法加入到内存的问题,通过term index加载到内存中,提高了查询效率
- Stored Fields:将数据内容持久化到磁盘中。
- Doc Values:基于某种数据(时间、价格)提前排序,用于快速排序查找和聚合。
二、ElasticSearch
1、高性能
- 一个index name对应一个lucene避免过多的资源争抢
- 单个index name拆分为shard分片,每个shard分片作为一个独立的Lucene库
2、高扩展
- 将分片部署在多个机器上,缓解单机压力
3、高可用
- 存在副本分片,主副封片读写分离,若主分片宕机,副本自动晋升为主分片。
- node角色分化,各司其职(处理用户请求、处理数据、处理节点管理)。
- 每个节点存在raft模块,同步各个结点的信息数据,所以node看到的集群状态一致。
三、ElasticSearch的写流程
- 用户发送请求到协调节点,协调节点根据哈希路由找到请求对应的node中的分片
- 写入到对应分片的lucene库里的segment类的inverted index、term index、sorted field、doc value里面
- 主分片将数据同步到副本
- 副本携入完成相应主节点发送Ack确认到协调节点,写入操作完成
四、ElasticSearch的读流程
1、Query阶段
- 用户发送请求到协调节点,协调节点根据index name查询到分片信息将请求转发到数据节点的
- 分片上的lucene并发搜索多个segment
- 返回找到的文档ID和聚合结果
- 返回查询结果
2、Fetch阶段
- 用户使用拿到的文档ID再次请求拿去数据
- 协调节点分发到对应Node的Shard分片,读取segment中的sorted fields
- 返回文档原始信息到用户