Solr的TrieField范围查询分析

简介:

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 "

相关文章
|
存储 缓存 固态存储
这样优化Elasticsearch,显著提升查询速度
elasticsearch的搜索效率与多方面有关,例如系统资源、数据查询方式、数据索引方式等,本文从各方面讨论如何进行搜索速度的优化,提升查询的性能。
1308 0
|
6月前
|
XML JSON PHP
22Solr复杂查询 - 使用后台查询
22Solr复杂查询 - 使用后台查询
19 0
|
6月前
23Solr复杂查询 - 使用solrj查询
23Solr复杂查询 - 使用solrj查询
24 0
|
6月前
|
Java 关系型数据库 MySQL
21Solr批量导入数据
21Solr批量导入数据
23 0
|
7月前
|
关系型数据库 MySQL 分布式数据库
ElasticSearch提高查询效率
ElasticSearch提高查询效率
88 0
|
9月前
|
索引
Elasticsearch 基础查询语句汇总
包含指定条件查询,区间查询,指定多个id查询,模糊查询,多字段查询,分页查询等
|
11月前
|
分布式计算 搜索推荐 架构师
【搜索引擎】Solr:提高批量索引的性能
【搜索引擎】Solr:提高批量索引的性能
|
JSON API 数据格式
19 个很有用的 ElasticSearch 查询语句 篇一
19 个很有用的 ElasticSearch 查询语句
|
关系型数据库 MySQL Java
Solr从myslq批量导入数据
Solr从myslq批量导入数据
64 0
Solr从myslq批量导入数据
|
存储 索引
Elasticsearch无索引查询分析介绍
众所周知,Elasticsearch提供的高效而丰富的查询分析能力,是基于Lucene提供的字段存储、倒排索引以及doc values等特性。通过倒排索引,可以快速过滤出符合查询条件的文档集合;结合doc values,可以高效地获取文档特定列的值信息,以便进行排序以及各种聚合操作;而字段存储则允许获取文档的原始内容。不难看出,字段存储、倒排索引以及doc values之间,是存在一定数据冗余的(
Elasticsearch无索引查询分析介绍