Elsticsearch为何搜索速度如此之快?

之前一直在项目中使用elasticsearch,用的是spring-data-elasticsearch。一直在使用却对搜索原理一直不太清楚,最近在网上看了些相关资料,特此总结一下:

首先,ES用的是倒排索引,何为倒排索引,我的理解就是将document的id按照field的value汇集起来,下边讲个例子:

创建一个index,type=user,document的filed定义为:

{
_id: 1
name : fujian,
age:28,
sex: male,
height:178cm
},
{
_id:2
name: jim,
age:28,
sex:male,
height:180cm
}

ok,当给上边这个type创建倒排索引的核心就是:

name     posting list
fujian     1
jim 	   2
age     posting list
28       [1,2]
sex     posting list
male      [1,2]
height       posting list
178cm         1
180cm         2

也就是,将每一个filed的在所有document中的可能值列举出来,并将这些值出现在的document id 放在 posting list中,这样 每当你检索一个filed的value(比如 male)时,就会将对应的document id 找出([1,2]),从而将相应的document查找出来。

当然这只是倒排索引的核心思想,为了防止内存占用过多,es的开发还定义了term index 和 term dictionary,term即filed对应的value。也就是说 term index保存了 term 的前缀 到 具体term value的映射关系,并且保存在内存中。这样就不必将所有的term dictionary 都放在内存中。通过 term index 定位到 term dictionary,然后再定位到posting list。

在这里插入图片描述
一般的mysql索引仅仅是 建立了 term dictionary 到 posting的映射,dictionary的建立是用了b-tree的排序方式,但es在这之前又添加了term index这一层,缩小了在dictionary上查找的范围,所以检索速度更快了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frank Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值