在集群内的原理, 我们介绍了分片, 并将它描述成最小的 ElasticSerch工作单元 。但是究竟什么是 一个分片,它是如何工作的? 在这个章节完后,下面你便会得到下面问题的答案。
(1)为什么搜索是近实时的?
(2)为什么文档的 CRUD (创建-读取-更新-删除) 操作是实时的?
(3)Elasticsearch 是怎样保证更新被持久化,在断电时也不丢失数据?
为什么搜索是近实时的?
关于近实时的定义:文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。
1、作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。
2、每个分片具有性能较高的倒排索引(相比B-tree更为优秀,trie字典树+FST压缩技术)
3、Lucene的段(segment)技术
4、关于一些消耗高昂query的缓存,和文档数较多的segment的缓存
关于第3点我们下面详细讨论下
索引与分片的区别
容易被混淆的概念是,一个 Lucene 索引 我们在 Elasticsearch 称作分片 。 一个 Elasticsearch 索引是分片的集合。 当 Elasticsearch 在索引中搜索的时候, 它发送查询到每一个属于索引的分片(Lucene 索引),然后合并每个分片的结果到一个全局的结果集。
Elasticsearch 基于 Lucene这个库引入了按段搜索的概念。还增加了 提交点 的概念 — 一个列出了所有已知段的文件。
如图,例如此lucu