ElasticSearch会对文字进行分词
分出来词的集合叫做 Term Dictionary
Term Dictionary 会排序(查找的时候可以使用二分查找)
词对应的文档ID叫做 Posting List
使用 FST 进行压缩,节省硬盘空间。使用Roaring Bitmaps 求出文档ID的交并集
由于Term Dictionary 的词量太大,不能全部装入到内存中,抽象了一层词前缀叫做 Term Index
Term Index 以FST 数据结构来保存词的前缀,节省内存且查找速度快
Elasticsearch写入
1.写到内存缓冲区,该内存缓冲区每秒会刷新到文件系统缓冲区(此时会生成一个segement 文件),有segement文件才能被索引
2.写到translog内存缓冲区,每隔5s会刷新到磁盘中。主要用作于备份(如果中途节点挂了,可以通过translog恢复数据),最多有5s数据丢失
3.隔30分钟或者translog文件过大,会执行一次commit操作,真正意义上完成一次持久化
Elasticsearch查询
查询的方式简单分为两种
通过ID搜索出对应的Doc
- 检索内存的Translog文件- 检索硬盘的Translog文件- 检索硬盘的Segement文件
通过query匹配相关的Doc
从内存和硬盘的Segement文件中查找
查询可以分为三个阶段
QUERY_AND_FETCH
(查询完就返回整个Doc内容)
QUERY_THEN_FETCH
(先查询出对应的Doc id ,然后再根据Doc id 匹配去对应的文档)
DFS_QUERY_THEN_FETCH
(先算分,再查询)
用得最多的就是QUERY_THEN_FETCH
向各个主分片和副本分片分发请求
得到各个节点返回的doc id,组成doc id集合
再次请求各个分片拿到对应的完整Doc
ElasticSearch架构
了解Index Type Document Field Mapping DSL 相关的术语
Index
ElasticSearch的Index相当于数据库的Table
架构
一个主节点,多个从节点
主分片可以写入、读取。副本分片可以读取
一个Index,多个分片可以提高系统的吞吐量
副本分片主要为了实现高可用
Elasticsearch更新和删除
有一个merge任务会把segement文件合并成一个(因为写入的时候每秒都会生成一个segement文件)
更新和删除的时候实际上是把doc记录的状态标识为delete
merge segement文件的时候会把被标识为delete状态的doc进行物理删除