關於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.首先第一步需要設定日誌檔案的路徑 預設存在的,可忽略該步驟 ...