Lucene中同時(shí)包括行存(Store)與列存(DocValues)的存儲(chǔ)方式,但不管是行存還是列存,當(dāng)應(yīng)用IndexSorting后,相鄰數(shù)據(jù)的相似度就會(huì)越高,也就越利于壓縮 。這不僅僅是體現(xiàn)在排序字段上,也體現(xiàn)在其他字段的相似度上 。比如時(shí)序場(chǎng)景,當(dāng)按照時(shí)間排序后,各個(gè)Metrics的值的近似度也會(huì)越大 。所以IndexSorting可以提高數(shù)據(jù)的壓縮率 。
IndexSorting是否適合我的場(chǎng)景?由排序條件決定是否適合
IndexSorting最大的作用就是優(yōu)化查詢(xún)性能,其適用的場(chǎng)景就是能夠被其優(yōu)化的場(chǎng)景,比如說(shuō):
查詢(xún)時(shí)需要根據(jù)某列或者某幾列排序后返回的場(chǎng)景:讓IndexSorting順序跟要查詢(xún)的Sort順序一致,讓Lucene能夠提前中斷來(lái)提升性能 。不關(guān)心結(jié)果順序的場(chǎng)景:也可以按照某列IndexSorting,查詢(xún)時(shí)也設(shè)置按照這一列Sort即可 。有幾種排序需求的場(chǎng)景:IndexSorting起碼可以?xún)?yōu)化一種排序需求,其余的幾種需求可以考慮是否多建幾個(gè)索引,用空間換時(shí)間 。也有些場(chǎng)景不能被其優(yōu)化,比如根據(jù)文檔相似度分?jǐn)?shù)排序的場(chǎng)景,這時(shí)候很難進(jìn)行預(yù)排序,因?yàn)橄嗨品謹(jǐn)?shù)是每次查詢(xún)時(shí)才算出來(lái)的 。
根據(jù)查詢(xún)?cè)砜词欠衲軆?yōu)化
上面提到Lucene會(huì)按照docID從小到大的順序選出符合條件的doc,但是有時(shí)查詢(xún)并不是慢在這個(gè)篩選過(guò)程,而是構(gòu)造docID列表的過(guò)程,這時(shí)IndexSorting帶來(lái)的優(yōu)化效果會(huì)比較有限 。
因?yàn)長(zhǎng)ucene的查詢(xún)?cè)硎潜容^復(fù)雜的,這里只列舉兩個(gè)例子:
對(duì)于字符串進(jìn)行Range查詢(xún),且Range范圍內(nèi)有很多符合條件的Term的場(chǎng)景 。這個(gè)場(chǎng)景下,查詢(xún)可能會(huì)慢在兩個(gè)地方,一個(gè)是Range范圍內(nèi)符合條件的Term非常多,掃描FST耗時(shí)很大,另一個(gè)如果這些Term對(duì)應(yīng)的doc數(shù)很多,要構(gòu)造BitSet也會(huì)非常耗時(shí) 。因?yàn)槔肐ndexSorting的提前中斷是發(fā)生在BitSet構(gòu)造好之后,所以并不能優(yōu)化到這個(gè)地方的性能 。對(duì)數(shù)字類(lèi)型在BKD-Tree上進(jìn)行范圍查找時(shí),因?yàn)锽KD-Tree里的docID不是順序排列的,所以并不像倒排鏈一樣可以順序讀取 。如果BKD-Tree上符合條件的docID很多,構(gòu)造BitSet也很耗時(shí),也不是IndexSorting能夠優(yōu)化到的 。考慮對(duì)寫(xiě)入性能的影響
IndexSorting優(yōu)化的是查詢(xún)性能,因?yàn)樵趯?xiě)入時(shí)需要對(duì)數(shù)據(jù)進(jìn)行排序,所以降低了寫(xiě)性能 。如果寫(xiě)性能是目前的性能瓶頸,或者看重寫(xiě)性能要高于查詢(xún)性能,那么不適合使用IndexSorting 。
IndexSorting是如何實(shí)現(xiàn)的?本文介紹一下IndexSorting的實(shí)現(xiàn)細(xì)節(jié),這也有助于大家理解它對(duì)寫(xiě)入性能產(chǎn)生的影響 。IndexSorting可以保證在每個(gè)Segment中,數(shù)據(jù)都是按照設(shè)置的方式進(jìn)行排序的,這要解決兩個(gè)問(wèn)題:
Lucene的Flush操作會(huì)生成Segment,這時(shí)候生成的Segment如何保證數(shù)據(jù)有序 。多個(gè)Segment進(jìn)行合并時(shí)如何保證有序 。1. Flush時(shí)保證Segment內(nèi)數(shù)據(jù)有序
大家知道,數(shù)據(jù)寫(xiě)入Lucene后,并不是立即可查的,要生成Segment之后才能被查到 。為了保證近實(shí)時(shí)的查詢(xún),ES會(huì)每隔一秒進(jìn)行一次Refresh,Refresh就會(huì)調(diào)用到Lucene的Flush生成新的Segment 。額外說(shuō)的一點(diǎn)是,Lucene的Flush不同于ES的Flush,ES的Flush保證數(shù)據(jù)落盤(pán),調(diào)用的是Lucene的commit,里面會(huì)調(diào)用fsync,這里的關(guān)系值得額外寫(xiě)一篇文章來(lái)說(shuō)清楚 。
我們需要先知道Flush前數(shù)據(jù)是一個(gè)什么樣的狀態(tài),才能知道Flush時(shí)如何對(duì)這些數(shù)據(jù)排序 。每個(gè)doc寫(xiě)入進(jìn)來(lái)之后,按照寫(xiě)入順序被分配一個(gè)docID,然后被IndexingChain處理,依次要對(duì)invert index、store fields、doc values和point values進(jìn)行處理,有些數(shù)據(jù)會(huì)直接寫(xiě)到文件里,主要是store field和term vector,其他的數(shù)據(jù)會(huì)放到memory buffer中 。
在Flush時(shí),首先根據(jù)設(shè)定的列排序,這個(gè)排序可以利用內(nèi)存中的doc values,排序之后得到老的docID到新docID的映射,因?yàn)橹癲ocID是按照寫(xiě)入順序生成的,現(xiàn)在重排后,生成的是新的排列 。如果排序后與原來(lái)順序完全一致,那么什么都不做,跟之前流程一樣進(jìn)行Flush 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 肚皮舞教程 動(dòng)作指導(dǎo)
- 肚皮舞教程的入門(mén)動(dòng)作
- 閑魚(yú)無(wú)貨源你必須搞懂的5個(gè)問(wèn)題 閑魚(yú)無(wú)貨源賺錢(qián)詳細(xì)教程
- 阿里云建網(wǎng)站詳細(xì)步驟 阿里云建站詳細(xì)教程
- imac一體機(jī)重裝系統(tǒng) imac裝win7詳細(xì)教程
- 路由器頻段帶寬設(shè)置方法教程 頻段帶寬
- 開(kāi)菜鳥(niǎo)驛站需要哪些前提條件 無(wú)經(jīng)驗(yàn)的人可以開(kāi)菜鳥(niǎo)驛站嗎
- ps圖片轉(zhuǎn)矢量圖教程 如何做矢量圖海報(bào)
- QQ永久凍結(jié)解封方法技巧教程 免費(fèi)強(qiáng)制解凍qq網(wǎng)站
- Excel文件轉(zhuǎn)Dat文件教程 dat是什么文件
