Elasticsearch系列---聚合查询原理

概要

本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先。

正排索引

聚合查询的内部原理是什么,Elastichsearch是用什么样的数据结构去执行聚合的?用倒排索引吗?

工作原理

我们了解到倒排索引对搜索是非常高效的,但是在排序或聚合操作方面,倒排索引就显得力不从心,例如我们举个实际案例,假设我们有两个文档:

  1. I have a friend who loves smile
  2. love me, I love you

为了建立倒排索引,我们先按最简单的用空格把每个单词分开,可以得到如下结果:
*表示该列文档中有这个词条,为空表示没有该词条

Term doc1 doc2
I * *
have *
a *
friend *
who *
loves *
smile *
love *
me *
you *

如果我们要搜索love you,我们只需要查找包含每个词条的文档:

Term doc1 doc2
love *
you *

搜索是非常高效的,倒排索引根据词条来排序,我们首先在词条列表中打到love,然后扫描所有的列,可以快速看到doc2包含这个关键词。

但聚合操作呢?我们需要找到doc2里所有唯一的词条,用倒排索引来完成,代价就非常高了,需要迭代索引的每个词条,看一下有没有doc2,有就把这个词条收录起来,没有就检查下一个词条,直到整个倒排索引全部搜索完成。很慢而且难以扩展,并且 会随着数据量的增加而增加。

聚合查询肯定不能用倒排索引了,那就用正排索引,建立的数据结构将变成这样:

Doc terms
doc1 I, have, a, friend, who, loves, smile
doc2 love, me, I, you

这样的数据结构,我们要搜索doc2包含多少个词条就非常容易了。

倒排索引+正排索引结合的优势

如果聚合查询里有带过滤条件或检索条件,先由倒排索引完成搜索,确定文档范围,再由正排索引提取field,最后做聚合计算。

这样才是最高效的

帮助理解两个索引结构

倒排索引,类似JAVA中Map的k-v结构,k是分词后的关键词,v是doc文档编号,检索关键字特别容易,但要找到aggs的value值,必须全部搜索v才能得到,性能比较低。

正排索引,也类似JAVA中Map的k-v结构,k是doc文档编号,v是doc文档内容,只要有doc编号作参数,提取相应的v即可,搜索范围小得多,性能比较高。

底层原理
基本原理
  1. 正排索引也是索引时生成(index-time),倒排索引也是index-time。
  2. 核心写入原理与倒排索引类似,同样基于不变原理设计,也写os cache,磁盘等,os cache要存放所有的doc value,存不下时放磁盘。
  3. 性能问题,jvm内存少用点,os cache搞大一些,如64G内存的机器,jvm设置为16G,os cache内存给个32G左右,os cache够大才能提升正排索引的缓存和查询效率。
column压缩

正排索引本质上是一个序列化的链表,里面的数据类型都是一致的(不一致说明索引建立不规范),压缩时可以大大减少磁盘空间、提高访问速度,如以下几种压缩技巧:

  1. 如果所有的数值各不相同(或缺失),设置一个标记并记录这些值
  2. 如果这些值小于 256,将使用一个简单的编码表
  3. 如果这些值大
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值