Solr的TrieField范围查询分析
solr从1.4版本开始,提供了一种字段类型TrieField(TrieLongField、TrieIntField等),用于范围查询,性能比普通的数值类型要快10倍。为什么会快那么多呢?网上找不到相关资料,通过分析源代码,大概了解了其原理,给大家分享下。
其中precisionStep代表字段值分段保存的时候,截断精度的大小。一般来说,其值越小,索引大小越大,查找速度越快。
TrieField字段在lucene中是用多个field来保存的,field的多少根据precisionStep决定,比如TrieIntField,precisionStep=”8″,则保存到索引中就是4个field,如图,32位的Int,每次缩进8位保存为一个field,新的field采用char数组来保存。因此索引的大小会比普通的IntField大。
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+255*2+255*2+256*2=1786个,传统的方式A~B个term要小的多,因此性能有很大的提升。
建议继续学习:
- 基于Solr的空间搜索(3) (阅读:3982)
- Solr\Lucene优劣势分析 (阅读:3421)
- 基于Solr的空间搜索(2) (阅读:3002)
- Solr调优参考 (阅读:3043)
- 基于Solr的空间搜索(1) (阅读:2763)
- Solr之缓存篇 (阅读:1476)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:华黎 来源: 淘宝网通用产品团队博客
- 标签: Solr TrieField
- 发布时间:2012-05-12 22:35:39
-
[842] WordPress插件开发 -- 在插件使用 -
[69] 再谈“我是怎么招聘程序员的” -
[65] 我对技术方向的一些反思 -
[64] 分布式系统设计系列 -- 基本原理及高可用策 -
[59] cookie窃取和session劫持 -
[58] 关于返回 Null 值的问题 -
[57] 检查nginx配置,重载配置以及重启的方法 -
[56] 学习:一个并发的Cache -
[54] 程序员技术练级攻略 -
[53] Java将Object对象转换为String


