ES多个字段的查询底层是如何实现的,原理是什么?

前言

在MySQL中,在where条件中有多个字段,如果多个字段有索引,MySQL会自动选择selective的字段作为索引去查询,如果是联合索引,会去走联合索引。

我们知道ES建立的是倒排索引,倒排索引是建立在一个字段上的,当我们以多个字段作为查询条件时,这多个字段的结果如何合并呢?

更具体来说,每个字段的查询结果是一个list,记录着相关文档的id及相关性等数据,ES是如何将这多个list进行合并的呢?

有两种实现方式。

使用 skip list 数据结构

前提是ES中文档的list是有序的,多个list互相skip。
简单起见,将问题抽象为[1,3,6,7,8,9]与[2,3,4,5,8,9]两个list,查找两个list的公共元素。则skip的过程 就是:遍历两个list,若两个list的当前元素相同,则存入结果list,若不同,较小的list迭代到下一个位置。这种方法的时间复杂度即为O(m+n)。

当然这是最基本的思路,实际上ES中的skip list还会有advance操作,即对于一个很长的 posting list,比如:[1,3,13,101,105,108,255,256,257],我们可以把这个 list 分成三个 block:[1,3,13], [101,105,108], [255,256,257]。然后可以构建出 skip list 的第二层:[1,101,255]1,101,255 分别指向自己对应的 block。这样就可以很快地跨 block 的移动指向位置了。

另外,E

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值