“All problems in computer science can be solved by another level of indirection.” – David J. Wheeler
学习ElasticSearch必须要认清ElasticSearch和Lucene的关系:ElasticSearch是建立在一组Lucene索引基础上的抽象层, 它的每一个 shard(无论primary 和 replica)都是一个完整和独立的Lucene索引实例。说白了,也就是在一组Lucene索引上建了 "another level of indirection",这层indirection带来的好处就是 : 分布式、可扩展和强容错的索引集群系统。其实,Lucene索引本身也是一层indirection, 真正的索引内容是存储在被称为segment单元中。一个Lucene索引由多个segment组成,segment是immutable的,也就是创建后不能再修改的,各种索引内容的缓存也都是基于每个segment的。
所以,当ElasticSearch收到一个为文档建立索引的请求时,它首先要做出的决定就是要在哪一个shard上对文档进行索引并保存结果。在具体实现上,ElasticSearch采用的是djb2 哈希算法对要索引文档的指定(或者默认的)key进行哈希,得到哈希结果后取模上(mod) ElasticSearch索引shard数目 n,公式如下: