之前一直在项目中使用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上查找的范围,所以检索速度更快了。