首先,Elasticsearch官网有完成的知识点讲解,读者可以自行深入学习——《Elasticsearch: 权威指南》。下面是我总结的部分知识点。
一、近实时搜索
- 一个文档被索引(用户新增数据)之后,会首先进入“内存缓冲区”,并同时追加到事务日志里(此时不能被搜索);
- 默认每隔1s进行refresh操作:文档被写入到一个新的段,此时从“内存缓冲区”写入到“文件系统缓存”,“文件系统缓存”里的文档可以被搜索到,“内存缓冲区”的文档被清空,但事务日志不变(所以是“近实时搜索”);
- 当事务日志太大或默认每隔30min,进行一次完整的flush:所有数据写入到磁盘里,并删除事务日志。
这是索引一个文档的普通流程。为了避免意外宕机导致未写入磁盘的数据丢失,新增如下步骤: - 事务日志里存了所有未被写入磁盘里的操作记录,默认每隔5s,将事务日志内容刷新到磁盘;
- 重启服务时,Elasticsearch会重放事务日志里的操作,这就可以避免意外宕机导致未写入磁盘的数据丢失。
用户可以修改上述提到的所有默认时间
二、路由一个文档到分片
- 官方文档:《路由一个文档到分片》、《新建、索引和删除文档》
- 概述:不同的文档会被路由到不同的分片,每组分片包含主分片和副本分片,它们的数据完全一样。
- 原理:
- 协调节点收到索引一个文档的请求时,默认根据文档的_id生成hash数,然后除以主分片的数量的余数就是具体的分片;
- 协调节点将请求转发到对应的主分片上;
- 主分片上执行成功后,将请求并行转发副本分片上;
- 副本分片执行完成后,主分片向协调节点报告成功;
- 协调节点返回成功消息给客户端。
三、搜索一个文档
- 官方文档:《取回一个文档》
- 概述:向任意一个节点发起请求,搜索任意一个文档。
- 原理:
- 客户端向任意节点(协调节点)发送获取请求;
- 节点根据文档的 _id来确定文档属于分片 A 。轮询访问主分片和副本分片中的其中一个分片A1;
- 分片A1将文档返回给协调节点,然后将文档返回给客户端。
四、分布式搜索
- 官方文档:《执行分布式搜索》
- 概述:Es从分布式集群中整合查询结果,返回给客户端。
- 原理
- 协调节点将搜索请求转发到各个分片的某个主分片或副本分片;
- 每个分片在本地执行查询并添加结果到大小为 from + size 的本地有序优先队列中;
- 每个分片返回各自优先队列中所有文档的 ID 和任何排序需要用到的值给协调节点;
- 协调节点合并搜索结果,然后进行全局排序,得到最后的有序文档_id队列;
- 协调节点向相关的分片提交GET请求;
- 每个分片加载并丰富文档(如果有需要的话),接着返回文档给协调节点;
- 一旦协调节点接收到所有的结果文档,它就组装这些结果为单个响应返回给客户端。
五、倒排索引
- 官方文档:《倒排索引》
- 概述:文档本身的索引是:文档_id-->文档内容,倒排索引是:所有文档内容里的各个关键字(经过部分文字分析算法)-->文档_id,例如:
文档1:The quick brown fox jumped over the lazy dog
文档2:Quick brown foxes leap over lazy dogs in summer
Term | Doc_1 | Doc_2 |
---|---|---|
brown | X | X |
dog | X | X |
fox | X | X |
in | X | |
jump | X | X |
lazy | X | X |
over | X | X |
quick | X | X |
summer | X | |
the | X |
网友评论