上中學的時候寫做文,最喜歡的季節我都是寫冬天。雖然是由於寫冬天的人比較少,那時確實也是對其餘季節沒有什麼特殊的偏好,反而一到冬天,本身皮膚會變得特別白。可是冬天啊,看到的只有四季常青盆栽:瓜慄(就是發財樹,好吧,算我矯情,反正我不喜歡這個名字),綠蘿,永遠看不到它開花的巴西鐵,富貴竹,散尾葵……過年的時候家裏的杜鵑就開花了,零星的幾朵小花兒更突顯了這個季節的淒涼。紅掌,蝴蝶蘭老是美美的在那裏,開不敗卻看不到生機。插到水裏的勿忘我,洋桔梗,看到他們也只會聯想到過幾天他們會枯萎的命運。春天來了,先是迎春花,而後是桃花,玉蘭。到了四月,紅葉碧桃,紫荊,櫻花,紫葉李,垂絲海棠……最喜歡丁香花的味道~~再過幾日,鬱金香和牡丹也該開了。桃之夭夭,灼灼其華。果真,陽光下這些花兒是流光溢彩的。人生的悲哀不是短暫的快樂事後無盡的痛苦,而是歷來沒讓本身快樂過。想一想小鮮肉看的《熊出沒-雪嶺熊風》電影,熊二沒有再次遇到糰子以前的魂兒不守舍,與糰子經歷過精彩以後,雖然別人什麼都不記得了,全部的場景回到了最初,熊二內心倒是知足和平靜。就像這些花兒,雖然是花開很少時,但盛開過的青春總好過冬青一日和一輩子毫無區別(中學做文裏還老是在讚賞它冬天仍是綠的呢[此處有表情])。大概如今和中學的時候最大的區別,就是那時候的人生觀更多的是受父母的影響。父母都是醫生,鐵飯碗,穩定是一成不變的追求。離父母愈來愈遠,活得愈來愈像本身,才發現本身的人生須要冬天的期待與思考,春天花的妖嬈,夏天葉的茂盛,秋天果實的沉重。誰規定的第一個季節是春天?個人人生第一個季節就不是html
下面介紹一些Lucene使用基本規則和算法。這些規則和算法的選擇,都和Lucene和支持TB級的倒排索引有關。linux
前綴後綴規則(Prefix+Suffix):在Lucene的反向索引中,要保存詞典的信息,全部的詞再詞典中是按照字典順序進行排列的,而後詞典中包含了文檔中的幾乎全部的詞,而且有的詞仍是很長的,這樣索引文件會很是的大,所謂前綴後綴規則,就是某個詞和前一個詞有共同的前綴的時候,後面的詞僅僅保存前綴在詞中的偏移(offset),和剩下的部分(後綴)。算法
好比:北京天安門 這個詞詞典裏一般都會包含北京 天安門 北京天安門 這三個詞。北京和北京天安門因爲前綴相同,在字典表裏會相鄰存儲,兩個詞存成 北京2天安門 ,這樣存比北京北京天安門 省空間。數據庫
差值規則(Delta):在lucene的反向索引中,須要保存不少整形數字的信息,好比文檔ID號,好比詞在文檔中的位置等等。整形數字是以可變長整型的格式存儲的。隨着數值的增大,每一個數字佔用的比特位增多。所謂差值規則就是前後保存兩個整數的時候,後面的整數僅僅保存和前面整數的差便可。多嘮叨兩句:由於看到有的哥哥們定義數據庫字段的時候老是想都不想就用varchar,MD5的結果也用varchar[汗]。MD5的結果長度是固定的,沒有必要用varchar來節省空間。定長的char效率會高些。數據結構
LZ4算法(Realtime Compression Algorithm):在操做系統(linux/freeBSD),文件系統(OpenZFS),大數據(Hadoop),搜索引擎(Lucene/solr),數據庫(Hbase)等中均可以看到它的身影,很通用。壓縮/解壓速度快。oop
跳躍表規則(Skip list):跳躍表是一種數據結構。額~~,要不能用幾句話把它介紹明白,真很差意思說本身有那麼多算法專利。首先使用跳躍表的前提是由於搜索引擎的索引數據是高度有序的。打個比方:我從北京回老家青州市能夠作北京南到青島的動車或者高鐵。它們的路線是同樣的,後者貴100塊錢。貴在哪裏呢?後者停的站少,就是跳站了。有的高鐵到青州市不停。我只能在前一站淄博或者後一站濰坊下車,而後坐慢車去青州市。跳躍表就是這個原理。全部的搜索數據存在一個鏈表裏,這就是慢車(最傳統的綠皮車)。而後新加一個鏈表,存的數據中間有間隔(K字頭車)。這時候我不得不說一個原則:全部原來的時間複雜度是delta(找這個符號比較費勁,我就直接用英文了,記住它是頗有好處的,去米國總免不了和這個航空公司打交道~~) n的算法,期待的終極優化後的結果基本都是 delta log n。因此只有兩層的話,時間複雜度是達不到要求的。怎樣達到要求呢?最終要造成一棵樹。怎麼造成一棵樹呢?加層唄。加大跳站的間隔,T字頭車,D字頭車,G字頭車。一直到中間是全部的站,造成了一個root。樹形結構就造成了。時間複雜度變成了delta log n[耶][耶] Lucene3.0以前不少地方使用這種數據結構來提升查找速度。可是由於它對模糊查詢的支持不太好,如今Lucene改用FST了。性能
關於delta再多嘮叨兩句:它是希臘語的第四個字母,大寫是△。我這麼懶,不肯意去拷貝一個小寫字母到這裏,大寫字母打出來也是由於我直接改用日語輸入法,打個[三角形]出來的~~。上面提到差值規則和時間複雜度都用到了delta。由於在數學或者物理中大寫的Δ用來表示增量符號。而小寫一般在高等數學中用於表示變量或者符號。因此差值規則裏用到了它大寫的含義,時間複雜度裏用到了它小寫的含義。大數據
有限自動機算法(FST,Finite State Transducer):經過輸入有序字符串構建最小有向無環圖。經過共享前綴來節省空間,內存存放前綴索引,磁盤存放後綴詞塊。Lucene的源碼中能夠看到它的具體實現。優化
Lucene之因此有那麼頻繁的版本升級,我之前還專門追劇似的關心這個升級,是由於這裏面有一個問題的發生與解決的過程,舉個簡單的例子:在Windows系統中一個文件夾只能存放2W多個文件,在1W多個文件之後寫入速度會急劇降低,Lucene這樣處理TB級數據的系統更要考慮數據量和性能的關係和權衡。搜索引擎
有限自動機是Lucene的核心查找算法,理解須要必定的時間。下面介紹Lucene的打分相關規則,這部分很容易理解。
文檔權重(Document boost):在索引時給某個文檔設置的權重值。
域權重(Field boost):在查詢的時候給某個域設置的權重值。
調整因子(Coord):基於文檔中包含查詢關鍵詞個數計算出來的調整因子。通常而言,若是一個文檔中相比其它的文檔出現了更多的查詢關鍵詞,那麼其值越大。
逆文檔頻率(Inerse document frequency):基於Term的一個因子,存在的意義是告訴打分公式一個詞的稀有程度。其值越低,詞越稀有(這裏的值是指單純的頻率,即多少個文檔中出現了該詞;而非指Lucene中idf的計算公式)。打分公式利用這個因子提高包含稀有詞文檔的權重。
長度歸一化(Length norm):基於域的一個歸一化因子。其值由給定域中Term的個數決定(在索引文檔的時候已經計算出來了,而且存儲到了索引中)。域越的文本越長,因子的權重越低。這代表Lucene打分公式偏向於域包含Term少的文檔。
詞頻(Term frequency):基於Term的一個因子。用來描述給定Term在一個文檔中出現的次數,詞頻越大,文檔的得分越大。
查詢歸一化因子(Query norm):基於查詢語句的歸一化因子。其值爲查詢語句中每個查詢詞權重的平方和。查詢歸一化因子使得比較不一樣查詢語句的得分變得可行,固然比較不一樣查詢語句得分並不老是那麼易於實現和可行的。
如需轉載,請註上個人原文連接: http://www.cnblogs.com/xiexj/p/6683439.html 謝謝哦~~