IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Solr的TrieField范围查询分析

淘宝网通用产品团队博客 2012-05-12 22:35:39 累计浏览 2,982 次
本机暂存

    solr从1.4版本开始,提供了一种字段类型TrieField(TrieLongField、TrieIntField等),用于范围查询,性能比普通的数值类型要快10倍。为什么会快那么多呢?网上找不到相关资料,通过分析源代码,大概了解了其原理,给大家分享下。

  • TrieField字段配置
  •     

        其中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+255*2+255*2+256*2=1786个,传统的方式A~B个term要小的多,因此性能有很大的提升。

    同分类推荐文章

    1. 第七章 事务 (2026-04-07 08:00:00)
    2. 第六章:分区 (2026-03-29 08:00:00)
    3. Neko Master: 从 0 到 1K+ Star 的 Vibe Coding 实践 (2026-03-01 08:00:00)

    查看更多 数据库 文章 →

    建议继续学习

    1. 如何成为Python高手 (累计阅读 54,901)
    2. Linux 性能监控、测试、优化工具 (累计阅读 12,942)
    3. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,720)
    4. Rolling cURL: PHP并发最佳实践 (累计阅读 11,421)
    5. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,802)
    6. jQuery性能优化指南 (累计阅读 8,722)
    7. 提升磁盘IO性能的几个技巧 (累计阅读 8,441)
    8. 关于PHP的编译和执行分离 (累计阅读 8,281)
    9. Mysql的随机读取 (累计阅读 7,800)
    10. redis 运维实际经验纪录之一 (累计阅读 7,640)