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