Elasticsearch

术语:

Term :索引里最小的存储和查询单元,词;

字典:Term的集合;

倒排表:记录某些词出现在哪些文章中;

正向信息:最原始的文档信息;

段:索引中最小的独立存储单元,不可变;

检索方式:

单个词

AND(分别查到词A和词B的文档链表,然后做交集运算)

OR(做并集运算)

NOT(做差集运算)

分段储存:

如果不分段储存的话,会生成一个非常大的倒排索引写入磁盘,并且如果索引有更新,就需要重新全量创建一个索引来替换原来的索引。这种方式在数据量很大时,效率过低。

因此在搜索中引入了段的概念,讲一个索引文件拆分为多个子文件,则每个子文件叫做段,每个段都是一个独立的可搜索数据集。并且段具有不可变性。

新增:新建一个段

删除:新增一个.del文件,储存被删除的数据id。查询还能查得到,只是进行链表合并时会把删除的过滤掉,在段合并时才会真正的移除

更新:删除+新增

优点:

不需要锁

缓存友好

增量创建

缺点:

空间浪费

为了提升写的性能,使用了优化的方式。

(1)新数据写入时,并没有直接写入硬盘中,而是暂时写入到内存,当内存中数据量达到一定阶段时,再批量提交到磁盘;

(2)达到除法条件后,会将内存中缓存的数据一次性写入磁盘,并生成提交点;

(3)清空内存;

(4)一个段一旦拥有提交点,那么这个段只有读权限,失去写权限,相反,它在内存中时,只有写权限,没有读权限。

段合并策略:

检索过程:

查询所有段中满足查询条件的数据,然后对每个段里查询的结果集进行合并,所以为了空值索引段里段的数量,必须定期进行段合并操作。但是如果每次合并所有的段,会造成资源浪费,所以,现根据段的大小进行分组,再将同一组的段进行合并,但是如果段特别大了,就不会再合并了。

原文地址:https://www.cnblogs.com/hekiraku/p/12054187.html