文章目录
前言
在之前工作中,简单接触过es,当时对这个中间件没有留意,只知道是个很厉害的‘东西’,现在回想起总感觉错过了些什么,决定渐渐深入的了解一下这个厉害东西,后面还会慢慢迭代出更深的理解
想要深入学习的同学请关注:铭毅天下
一、倒排索引是什么?
顾名思义,索引‘倒’过来,拿我们基本都用过MySQL来举例子,MySQL的索引大家应该都不陌生,一般为B+Tree索引,索引Tree上每个节点都是key,通过指向找到叶子节点的data,整个过程就是通过索引来找到具体的数据。
而倒排索引则是将数据拆散,拆散的每一部分都是索引。下面详细的简单说下…
倒排索引主要有单词词典(Trem Dictionary)、倒排列表(Posting List),倒排文件(Inverted File) 组成
- 首先将检索的单词先用分词器进行分词,将输入的文件根据规则拆分成一个或者多个term,
- 然后再将每个Term在Term Dictinary中查找出对应的Posting List,Posting List中是数据对应的索引,可能是单个,有可能是个数组,
- 再通过这些索引确定到具体数据
下面是倒排索引的几个关键点:
Term
输入的待检索文件经过分词器拆分得到多个Term。
Term Dictionary
使用B+Tree索引结构,记录了全部的Term,包含Trem对应Posting Lsit的指针
Posting List
1.文档ID记录原始数据的位置
2.单词频率,记录该单词在检索文本中出现次数,后续用于计算分数
3.位置,记录Trem在Term Dictinary的分词位置(会出现多次),用作词语搜索
4.偏移,记录Term开始和结束的位置,用于高亮显示 highlight
Inverted File
所有Term的Posting List都有顺序的储存在磁盘的某个文件里,储存Posting List的物理文件
二、什么是分片shard
简单来讲分片就是咱们在ES中所有数据的文件块,也是数据的最小单元块,整个ES集群的核心就是对所有分片的分布、索引、负载、路由等达到惊人的速度。
shard 分为主分片(primary shard)和副本分片(replica shard)。主分片负责写和读,而从分片负责读和备份。
primary shard 主分片
primary shard每个分片都有自己的序号,协调节点根据hash算法将数据对应到primary shard上面进行读写操作
shard = hash(document_id or routing parameter) % (num_of_primary_shards)
replica shard 副本分片
replica shard:primary shard的副本切片,系统默认副本策略为Quorum,即写入半数副本就可以返回成功
5.X 和 7.X 版本区别
5.X版本中,默认切片5个,每个index中能有多个添加type
升级到目前7.X版本,默认切片1个,每个index只能有一个type
默认一个type的原因如下:
1. 在同一个index里面,typeA的filed会占用typeB的资源(相互消耗资源),形成一种稀疏存储的情况,尤其是doc value
2. doc value为了性能会考虑保留一部分磁盘空间,可能一位置typeA需要但是typeB不需要
3. 不同type之间会干扰评分
每个shard限制最高1024个索引
查询条数阈值默认10000,子查询的阈值默认100,脚本查询阈值默认32,正则表达查询默认1000,term默认100W
es在启动的时候就已经指定了默认主切片,不能改变,但是复制切片能{"setting":{"number_of_replicas": 2}}
进行添加,然后平均分到节点上。
shar的实际上就是一个Lucene的一个实例(Lucene Index),单个Lucene实例里面最多包含(Integer.MAX_VALUE-128)个Document
Lucene Index文件系统看就是一个储存一些列文件的目录,一个Lucene Index由多个独立的Segment组成,Segment中包含了文档中的Term, Term Dictionary,Document