面向文档型数据库,一条数据就是一个文档,用json把文档序列化。
关系数据库=elasticsearch
数据库=索引
表=类型
行=文档
列=字段
交互能够用java api或http的restful api,插入一条记录就是对一个uri执行put

PUT /megacorp/employee/1{    "name" :     "John",    "sex" :      "Male",    "age" :      25,    "about" :    "I love to go rock climbing",    "interests": [ "sports", "music" ]}

es的设计主旨:检索性能
为了进步检索性能,要就义插入、更新的性能。
插入时,会为每个字段建设倒排索引。

倒排索引

Term:阳光
posting list:12,23,45
这样搜寻“阳光”,就能够马上找到有“阳光”的文档
Term dictionary:
把“阳光”“雨水”等term排序,二分法查找term,logn的查找效率。
Term index:
通过磁盘性能差,所以es通过内存查找term,term太多,term dictionary就会很大。term index是基于前缀的树状索引,能够找到term的offset从而定位到term。


再联合fst压缩技术,term index就能够缓存到内存里了。

压缩技巧

1.posting list有序
step1 实在值存储变增量存储,step 2 分区,step 3 以字节模式存储

Roaring bitmaps

将posting list依照65535为界线分块,用<商,余数>的组合示意每一组id,

65535是一个经典值,因为它=2^16-1,正好是用2个字节能示意的最大数,一个short的存储单位。
最初的block,如果超过4096个元素,用bitset存,否则用short[]存。
65536个元素用bitmap存恒定8192bytes,用short[]存是2*nbytes。

联结索引

多个field索引联结查问
用跳表做疾速与运算,或者用bitset按位与

跳表查问很快,所以对最短的posting list每个元素判断其余两个posting list里是否存在就行。

用bitset就直观的按位与就行了。

总结和思考

es的思路:1.能搬进内存的尽量搬进内存,缩小磁盘读取次数。2.能压缩的尽量压缩,严苛地应用内存。

留神点

不须要索引的字段肯定要标出来,默认是建索引的
不须要anayasis的string也要标出来,默认是analysis的
选有法则的id很重要,晋升压缩效率和寻道效率