天天看點

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大。

<a></a>

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 "

繼續閱讀