elasticsearch吧 关注:1,519贴子:5,327
  • 0回复贴,共1

elasticsearch如何联合索引查询?

只看楼主收藏回复

elasticsearch如何联合索引查询?
所以给定查询过滤条件 age=18 的过程就是先从term index找到18在term dictionary的大概位置,然后再从term dictionary里精确地找到18这个term,然后得到一个posting list或者一个指向posting list位置的指针。
然后再查询 gender=女 的过程也是类似的。
最后得出 age=18 AND gender=女 就是把两个 posting list 做一个“与”的合并。
这个理论上的“与”合并的操作可不容易。
对于mysql来说,如果你给age和gender两个字段都建立了索引,查询的时候只会选择其中最selective的来用,然后另外一个条件是在遍历行的过程中在内存中计算之后过滤掉。
那么要如何才能联合使用两个索引呢?有两种办法:
使用skip list数据结构。同时遍历gender和age的posting list,互相skip;
使用bitset数据结构,对gender和age两个filter分别求出bitset,对两个bitset做AN操作。
PostgreSQL 从 8.4 版本开始支持通过bitmap联合使用两个索引,就是利用了bitset数据结构来做到的。
当然一些商业的关系型数据库也支持类似的联合索引的功能。Elasticsearch支持以上两种的联合索引方式,如果查询的filter缓存到了内存中(以bitset的形式),那么合并就是两个bitset的AND。
如果查询的filter没有缓存,那么就用skip list的方式去遍历两个on disk的posting list。


IP属地:北京1楼2022-05-07 16:42回复