关于es6:es索引原理

8次阅读

共计 1032 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 0