lucene splitRange 切割區間的原理

2021-06-10 18:27:04 字數 2599 閱讀 9754

關於lucene的splitintrange(final intrangebuilder builder,final int precisionstep,final int minbound, final int maxbound)和splitlongrange(finallongrangebuilder builder,final int precisionstep, final long minbound, final longmaxbound)這兩個方法,在相關的技術論壇很少有提及的,就算有提及的,好像也只是蜻蜓點水一樣。通過昨天一天的思考,對這個演算法有了點認識,就想把這個想法分享一下。

1.首先這兩個方法是把乙個區間分割成幾個區間,這幾個區間是相互之間不會重複的。這點必須認識到。 2.

為什麼會有兩個方法,因為切割的物件不同,乙個針對int;乙個針對long。(不過最終它們還是調了同乙個方法,也就是splitrange(final object builder, final int valsize,final intprecisionstep, long minbound, long maxbound))

我沒有具體的來闡述**,只是把最後的這個方法的原理闡述一下,之後就可以根據這個原理對照著**進行閱讀,相信是事半功倍的。下面開始:

這個方法像上面所說的是把乙個區間切割,所以舉個例子,比如說現在要切割區間[1-12340],

如果按照十進位制的切割法,應該被切割成

[0][1-9]------------------------>1-9

[1][1-9]------------------------>10-99

[2][1-9]------------------------>100-999

[3][1-11]----------------------->1000-11999

[2][120-122]----------------->12000-12299

[1][1230-1233]-------------->12300-12339

(第乙個數字代表位數)

上面說的是十進位制的,現在如果把它切換成16進製制的話,就變成了下面這樣:原區間[00,00,00,01-00,00,30,34],切割之後:

[0][00,00,00,01-00,00,00,0f]------------------>[00,00,00,01-00,00,00,0f]--------------->[1-15]

[1][00,00,00,1-00,00,00,f]--------------------->[00,00,00,10-00,00,00,ff]---------------->[16-240]

[2][00,00,01-00,00,0f]-------------------------->[00,00,01,00-00,00,0f,ff]----------------->[256-3840]

[3][00,00,1-00,00,2]----------------------------->[00,00,10,00-00,00,2f,ff]----------------->[4096-8192]

[1][00,00,30,0-00,00,30,2]-------------------->[00,00,30,00-00,00,30,2f]---------------->[12288-12320]

[0][00,00,30,30-00,00,30,34]----------------->[00,00,30,30-00,00,30,34]--------------->[12336-12340]

再把最後的十進位制區間轉換成lucene內部儲存數字的字串格式,也就是呼叫inttoprefixcoded(final int val, final int shift, final charbuffer)或者

longtoprefixcoded(final long val, finalint shift, final char buffer)

調完了之後變成了下面這樣:

[1-15]----------------------------------->[60,08,00,00,00,01-60,08,00,00,00,0f]

[16-240]------------------------------->[64,40,00,00,01-64,40,00,00,0f]

[256,3840]---------------------------->[68,04,00,00,01-68,04,00,00,0f]

[4096-8192]-------------------------->[6c,20,00,01-6c,20,00,02]

[12288-12320]----------------------->[64,40,00,06,00-64,40,00,06,02]

[12336,12340]----------------------->[60,08,00,00,60,30-60,08,00,00,60,34]

下面來說為什麼要轉換成16進製制。因為數字格式在lucene中是被儲存成字串的。而且這些字串是以trie樹的形式儲存的。這些trie樹的父節點都是自己點右移4為形成的,所以要以16進製制來計算。這裡並不討論lucene是怎樣把數字儲存成字串的,這方面的資料網上很多。

講到這裡原理基本上講完了,如果關於lucene的問題,都可以發信給我,一起討論。

日誌的切割

如果這個日誌是靜態的。比如沒有應用向裡面寫內容。那麼我們也可以用split工具進行切割 其中logrotate支援按時間和大小來自動切分,以防止日誌檔案太大。真正內容 當日誌達到某個特定的大小,我們將日誌分類,之前的日誌保留乙個備份,再產生的日誌建立乙個同名的檔案儲存新的日誌.logrotate配置...

nginx日誌的切割

日誌的切割就是把日誌以天為單位存放,這樣便於我們對日誌的檢視以及分析,對錯誤的排查更加的迅速。access log 存放的是nginx成功訪問的日誌資訊 error log 存放的是nginx訪問失敗的日誌資訊 nginx.pid 裡面存放的是nginx的程序的pid date命令 root loc...

apache的日誌切割

當我們每訪問一次 就會產生若干條日誌資訊,如果日誌都存放在乙個檔案中,時間久了日誌檔案將會越來越大,不僅占用空間也不方便運維和開發人員對日誌的分析 此時就需要對日誌進行切割,比如按天或者按小時產生新的日誌檔案。那麼如何進行日誌的切割呢?1.首先第一步需要設定日誌檔案的路徑 預設存在的,可忽略該步驟 ...