elasticsearch菜鸟教程 阿里云elasticsearch内核介绍


elasticsearch菜鸟教程 阿里云elasticsearch内核介绍

文章插图
前言前两周写过一篇《基于Lucene查询原理分析Elasticsearch的性能》,在最后留了一个彩蛋,说下一篇会介绍一种可以极大的优化查询性能的技术 。本文就来介绍这种技术——IndexSorting 。
因为IndexSorting是在ES6.0之后才作为实验性的功能加入,相关的介绍资料还比较少,所以大部分人对它不够了解 。另一方面是,想要理解它为什么能够优化性能、适合哪些场景、内部如何实现、有何副作用等,也需要花一翻功夫 。所以本文专门对IndexSorting进行一个介绍,并分析它的作用、实现、适用场景等 。如果你的场景能用上IndexSorting,那么它肯定会给你带来一个巨大的性能提升!
什么是IndexSorting?IndexSorting是ES的新功能
在Elasticsearch中,IndexSorting是一个很新的功能,6.0版本才引入,并且标记这个功能是Beta版(6.5版本可能会去掉Beta标记) 。
在Lucene中,IndexSorting其实已经发展了一段时间 。最早在10年,Lucene提供了一个IndexSorter的工具,作为一个离线工具可以对Index数据排序后生成一个新的Index 。后来13年加入了SortingMergePolicy,在Segment进行merge的时候可以生成排好序的新Segment,在17年又加入了Sorting on flushed segment的功能,在Segment最初生成时就进行排序 。另一方面是Lucene在查询时也做了很多优化,如果有IndexSorting,很多地方做了提前中断,后面会讲提前中断对查询性能的巨大作用 。经过几次Lucene的改进和优化,IndexSorting这个功能也终于被集成进Elasticsearch 。
IndexSorting是一种预排序
与查询时的Sort不同,IndexSorting是一种预排序,即数据预先按照某种方式进行排序,它是Index的一个设置,不可更改 。大家知道,Elasticsearch的底层是Lucene,Lucene中是以Segment为单位进行查询的,这里说的IndexSorting对数据进行预排序也是在每个Segment内有序的 。
一个Segment中的每个文档,都会被分配一个docID,docID从0开始,顺序分配 。在没有IndexSorting时,docID是按照文档写入的顺序进行分配的,在设置了IndexSorting之后,docID的顺序就与IndexSorting的顺序一致 。
举个例子来说,假如文档中有一列为Timestamp,我们在IndexSorting中设置按照Timestamp逆序排序,那么在一个Segment内,docID越小,对应的文档的Timestamp越大,即按照Timestamp从大到小的顺序分配docID 。
为什么IndexSorting可以优化性能?
提前中断
IndexSorting能够优化性能,主要就是靠四个字,“提前中断” 。但是提前中断是有条件的,需要查询的Sort顺序与IndexSorting的顺序相同,并且不需要获取符合条件的记录总数(TotalHits) 。
Lucene中的倒排链都是按照docID从小到大的顺序排列的,在进行组合条件查询时,也是按照docID从小到大的顺序选出符合条件的doc 。那么当查询时的Sort顺序与IndexSorting的顺序相同时,会发生什么呢?
比如查询时希望按照Timestamp降序排序后返回100条结果,在Lucene中进行查询时,发现docID对应的doc顺序也刚好是Timestamp降序排序的,那么查询到前100个符合条件的结果即可返回,这100个一定也是Timestamp最大的100个,这就做到了提前中断 。
提前中断可以极大的提升查询性能,特别是当一个查询条件命中的文档数量非常多的时候 。在没有IndexSorting时,必须把所有符合条件的文档的docID扫描一遍,并且读取这些doc的一些字段来排序,选出符合条件的doc 。有了IndexSorting之后,只需要选出前Top个doc即可,避免了全部扫描,性能甚至可以提升几个数量级 。
IndexSorting提高了数据压缩率
Lucene中使用了很多的压缩算法来对数据进行压缩,压缩一方面减少了磁盘使用量,另一方面也减少了查询时读取磁盘的数据量和IO次数等,对查询性能有很大帮助 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: