Solr的TrieField范围查询分析
2023-03-14 22:31:51 时间
solr从1.4版本开始,提供了一种字段类型TrieField(TrieLongField、TrieIntField等),用于范围查询,性能比普通的数值类型要快10倍。为什么会快那么多呢?网上找不到相关资料,通过分析源代码,大概了解了其原理,给大家分享下。
- TrieField字段配置
<fieldType name=”tint” precisionStep=”8” omitNorms=”true” positionIncrementGap=”0”/>
其中precisionStep代表字段值分段保存的时候,截断精度的大小。一般来说,其值越小,索引大小越大,查找速度越快。
- TrieField索引
TrieField字段在lucene中是用多个field来保存的,field的多少根据precisionStep决定,比如TrieIntField,precisionStep=”8”,则保存到索引中就是4个field,如图,32位的Int,每次缩进8位保存为一个field,新的field采用char数组来保存。因此索引的大小会比普通的IntField大。
- TrieField的范围查询:
TrieField的范围查询通过高位范围匹配,低位边缘匹配,得到需要查询的term,再查询这些term得到docid来实现。
查找的过程:
1、将查找的范围A~B的上下界A、B值,取出最高8位,标记为A1、B1,到第一段找在(A1~B1)内的term,得到需要查找的termlist1
2、继续取A、B值的最高16位,标记为A2、B2,到第二段来查在(A2~A1 11111111]和[B1 11111111,B2)范围内的Term,得到termlist2
3、继续取A、B值的最高24位,标记为A3、B3,到第三段来查在(A3~A2 11111111]和[B2 11111111,B3)范围内的Term,得到termlist3
4、继续取A、B值的最高24位,也即A、B值,到第四段来查找[A~A3 11111111]和[B3 11111111,B]范围内的Term,得到termlist4
5、最后查询这些term,归并,就得到了符合查询条件的docid了。从上面的描述,我们可以看到,需要查询的term最多为254+2552+2552+256*2=1786个,传统的方式A~B个term要小的多,因此性能有很大的提升。
本文来源于"阿里中间件团队播客",原文发表时间" 2012-05-05 "
相关文章
- 数据库与其备份恢复主要注意事项
- 查询中,有没有可能多个索引一起用呢?
- 建议在复杂性能关键的表上所有查询都加上Force Index
- 不要再用 Where 1=1了!有更好的写法!
- 千万级用户系统的SQL调优实战
- 15个必知的 MySQL 索引失效场景,别再踩坑了!
- 别再用 Redis List 实现消息队列了,Stream 专为队列而生
- MySQL主从如何保证高可用
- Citus 简介,将 Postgres 转换为分布式数据库
- 面试杀手锏:Redis源码之BitMap
- 神奇了,当 MySQL l查询条件为“>=”时,竟然不走索引?
- SQL优化-隐式字符编码转换
- 《一起学mongodb》之第四卷 索引
- InnoDB原理篇:聊聊数据页变成索引这件事
- 数据库读写分离如何保证主从一致性
- 一文弄懂分库分表模式下数据迁移
- PostgreSQL 开始支持 Zstd
- 面试就面试,问我原理干嘛,Order By
- 聊一聊MySQL的共享锁和独占锁
- 一篇带给你跨数据源实现数据同步