lucene效能優化

2021-09-12 03:32:21 字數 1748 閱讀 1244

優化搜尋效能 

雖然建立索引的操作非常耗時,但是那畢竟只在最初建立時才需要,平時只是少量的維護操作,更何況這些可以放到乙個後台程序處理,並不影響使用者搜尋。我們建立索引的目的就是給使用者搜尋,所以搜尋的效能才是我們最關心的。下面就來**一下如何提高搜尋效能。 

1 將索引放入記憶體 

這是乙個最直觀的想法,因為記憶體比磁碟快很多。lucene提供了ramdirectory可以在記憶體中容納索引: 

directory fsdir = fsdirectory.getdirectory(「/data/index/」, false); 

directory ramdir = new ramdirectory(fsdir); 

searcher searcher = new indexsearcher(ramdir); 

但是實踐證明ramdirectory和fsdirectory速度差不多,當資料量很小時兩者都非常快,當資料量較大時(索引檔案400m)ramdirectory甚至比fsdirectory還要慢一點,這確實讓人出乎意料。 

而且lucene的搜尋非常耗記憶體,即使將400m的索引檔案載入記憶體,在執行一段時間後都會out of memory,所以個人認為載入記憶體的作用並不大。 

2 優化時間範圍限制 

既然載入記憶體並不能提高效率,一定有其它瓶頸,經過測試發現最大的瓶頸居然是時間範圍限制,那麼我們可以怎樣使時間範圍限制的代價最小呢? 

當需要搜尋指定時間範圍內的結果時,可以: 

1、用rangequery,設定範圍,但是rangequery的實現實際上是將時間範圍內的時間點展開,組成乙個個booleanclause加入到 booleanquery中查詢,因此時間範圍不可能設定太大,經測試,範圍超過乙個月就會拋booleanquery.toomanyclauses,可以通過設定 booleanquery.setmaxclausecount(int maxclausecount)擴大,但是擴大也是有限的,並且隨著maxclausecount擴大,占用記憶體也擴大 

2、用rangefilter代替rangequery,經測試速度不會比rangequery慢,但是仍然有效能瓶頸,查詢的90%以上時間耗費在 rangefilter,研究其原始碼發現rangefilter實際上是首先遍歷所有索引,生成乙個bitset,標記每個document,在時間範圍內的標記為true,不在的標記為false,然後將結果傳遞給searcher查詢,這是十分耗時的。 

3、進一步提高效能,這個又有兩個思路: 

b、降低時間精度。研究filter的工作原理可以看出,它每次工作都是遍歷整個索引的,所以時間粒度越大,對比越快,搜尋時間越短,在不影響功能的情況下,時間精度越低越好,有時甚至犧牲一點精度也值得,當然最好的情況是根本不作時間限制。 

第一組,時間精度為秒: 

方式 直接用rangefilter 使用cache 不用filter 

平均每個執行緒耗時 10s 1s 300ms 

第二組,時間精度為天 

方式 直接用rangefilter 使用cache 不用filter 

平均每個執行緒耗時 900ms 360ms 300ms 

由以上資料可以得出結論: 

1、 盡量降低時間精度,將精度由秒換成天帶來的效能提高甚至比使用cache還好,最好不使用filter。 

2、 在不能降低時間精度的情況下,使用cache能帶了10倍左右的效能提高。 

3 使用更好的分析器 

這個跟建立索引優化道理差不多,索引檔案小了搜尋自然會加快。當然這個提高也是有限的。較好的分析器相對於最差的分析器對效能的提公升在20%以下。

lucene索引優化前後效能對比及優化方針

針對目前線上產品進行壓力,發現不少問題,現在做個總結 我們的產品是乙個問答系統,主要核心技術是lucene搜尋,針對不同例項,分成不同的索引目錄,有n個例項會存在n個indexwriter 目前測試資料量及環境如下 6核4g 資料量1000萬 問題字數 平均14個字 問題答案字數 平均418個字 優...

提高Lucene索引效能

當索引的檔案不多時,用 lucene 預設的設定就能得到很好的效能。但是,如果索引大量檔案,就得通過一些手段去提高 lucene 索引效能。1 索引效能差的原因 1 lucene 索引過程 在索引檔案的過程中,lucene 不是直接將檔案索引到磁碟上,而是首先快取,然後在寫到磁碟。如上圖所示。2 索...

Lucene構建index效能調整

1 調整maxbuffereddocs和mergefactor,經過除錯,發現maxbuffereddocs 1000,mergefactor 100時效能較好。indexmodifier new indexmodifier c indexpath newstandardanalyzer true ...