面向文档型数据库,一条数据就是一个文档,用 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 很重要,晋升压缩效率和寻道效率