倒排索引
1,Term Index
B-Tree通过减少磁盘寻道次数来提高查询性能.
es更绝,直接把term组织成term index,直接压缩放在内存中,不用读磁盘
2,Term Dict
为了能够快速找到某个term,需要使用二分法以logN时间复杂度查找某个term
每一个term 对应了一个posting list,就是出现过这个term的文档的编号,注意posting list的编号是有序的
3,Posting List
posting list是一个int的数组,存储了所有符合某个term的文档id
1,Term Index采用FST,有效的减少的空间,可以使索引在内存中。mysql通过B+树索引查找需要读取磁盘,es采用了各种压缩算法,使索引尽可能的在内存中。
2,
3,Posting List的压缩方法:
3.1,FOR算法,frame Of Reference
当使用于 查询情况 时,查询就变成了一个“评分”的查询。评分查询(scoring queries)不仅仅要找出匹配的文档,还要计算每个匹配文档的相关性,计算相关性使得它们比不评分查询费力的多。同时,查询结果并不缓存。更适合用FOR算法。
3.2,RBM算法,Roaring bitmaps 位图压缩算法
过滤查询(Filtering queries)只是简单的检查包含或者排除,这就使得计算起来非常快。考虑到至少有一个过滤查询(filtering query)的结果是 “稀少的”(很少匹配的文档),并且经常使用不评分查询(non-scoring queries),结果会被缓存到内存中以便快速读取,所以适合采用压缩效率更高的Roaring bitmaps算法。
1)、将0-32-bit [0, n) 内的数据劈成 高16位和低16位两部分数据
2)、高16位用于查找数据存储位置,低16位存在在一个容器中(不就是一个类似HashMap结构么)
容器补充:容器是一个动态的数组,当数据小于4096个时,使用16bit的short数组存储,多余4096个时,使用216bits的BitMap存储;
为什么使用两种数据结构来存储低16位的值:
short数组:2bit * 4096 = 8KB
BitMap:存储16位范围内数据 65536/8 = 8192b,
所以低于 4096个数,short 数组更省空间。
总结就是:1.高效的压缩;2.快速的编码解码
ES性能优化(分片,路由,查询方式)索引在es中是一组文档的集合
分片指的是,因为es是个分布式搜索引擎,所以索引通常会分布在不同的节点.这些分布在不同节点上的数据就是分片,es会自动管理和组织分片,并且在必要的时候对分片数据进行reblance
副本是保持高可用
分片配置不能随意改变,如果要改动就需要reindex
每个分片本质上就是一个Lucene索引,因此会消耗相应的文件句柄,内存和CPU资源
每个搜索请求会调度到索引的每个分片中,所以分片要尽可能分散在不同节点,当分片开始竞争相同的硬件资源的时候性能就会下降
为什么是近实时的?
es 中的 segment、translog、refresh、flush、fsync、commit poit 等概念介绍_王大呀呀的博客-CSDN博客_es fsync



