這篇文章主要介紹了如何提高lucene的搜尋速度。介紹的大部分思路都是很容易嘗試的,當然另外一部分可能會加大你程式的複雜度。所以請確認搜尋速度確實很慢,而且很慢的原因確實是因為lucene自身而造成的。推薦姐妹篇:如何提高和優化lucene索引速度
遠端檔案系統一般來說都會降低搜尋速度。如果索引必須分布在遠端伺服器,可以嘗試將遠端檔案系統設定為唯讀。在某些情況下,這樣可以提高效能。
lucene搜尋可以很好的工作在基於快閃儲存器的固態硬碟上。固態硬碟的尋道時間大概比傳統的以磁碟為基礎的硬碟快100倍。這意味著,配備固態硬碟的機器用於檔案快取的記憶體將變少,搜尋需要較少的熱身時間,能夠更加迅速作出反應。
在程式的查詢中共享乙個indexsearch例項,它支援多執行緒安全。
第一次搜尋將花費部分時間在快取上(特別在按某個字段排序的情況下),從而可能使你的測試結果不太準確(假設你在多個查詢中復用乙個indexsearch例項)。另一方面來說,如果你一次又一次的重複同乙個查詢,所得的測試結果也是不準確的。因為作業系統將利用其快取記憶體加速io操作。在linux上,你可以使用如下命令清除磁碟快取記憶體:
echo 3 > /proc/sys/vm/drop_caches.
為了獲得更新的索引資訊,你必須重新構造indexsearch。當然,重新構造乙個searcher會帶來一定的系統開銷(注意,這大多發生在大索引以及自定義排序上),所以你應該儘量減少重新構造。你可以考慮在重新構造之後強制進行一次搜尋預熱。
乙個優化後的索引只含有乙個segment(其實說法不嚴謹,這也取決於乙個segment最多含有的文件引數),這將比同等情況下含多個segment的索引搜尋速度更快。特別是在大索引的情況下。如果你的程式不經常更新索引,那麼花費一定的時間來優化下,然後使用優化後的索引來進行搜尋。如果你的索引更新的頻率很高,那麼優化索引將會是乙個很耗時間的事情,這個時候你可以減少mergefactor引數。
個人建議,在頻繁更新索引的情況下,使用兩個索引,乙個大的優化好的歷史索引,乙個小的實時新增的索引(如果資料不大的情況下,直接使用ramdirectory,然後定時的合併到大索引中)
更小的合併因子意味著索引中擁有更少的segment,搜尋速度也將更快。但是,這也將降低索引速度。你需要自己測試乙個值來平衡二者的關係。(此條只適用於不能經常優化的索引庫)
從索引中獲取資料是一件很耗時間的事情,你最好只獲取使用者需要的資料。而不是整個文件中儲存的資料。每個文件的取回,lucene都必須去索引檔案中不同的地方甚至是不同的檔案中查詢。可以嘗試將你需要的文件先按文件編號排序再獲取。
獲取更多的搜尋結果將會降低搜尋速度。有兩個原因:其一,search方法在返回hits物件時,如果超過100個hits,lucene將在內部自動重新執行搜尋。解決方案:使用返回hitcollector的search方法。其二,搜尋結果可能分布在硬碟的不同地方,獲取他們可能需要很多的io操作。這個是很難避免的,除非索引比較小,可以直接快取到記憶體當中。如果你不需要完整的文件物件,你只需要其中的乙個很小的字段,你可以使用fieldcache類來快取它,從而達到快速訪問的效果。
fuzzy查詢執行cpu密集型字串比較,盡量避免將使用者查詢的term與所有的 term進行比較。你可以設定只比較以前n個字元開頭的term。prefixlength在queryparser以及fuzzyquery中可以設定。預設值為0,將比較所有的term。
有時候我們的查詢將限制部分索引中的記錄,這時候使用乙個經過快取了的bit set filter將比使用查詢子句更有效,尤其在乙個大索引中。過濾器經常用在查詢分類結果上。它可以用查詢子句限制來替換,區別在於使用query將影響文件的得分,而filter不會。
如何提高和優化Lucene搜尋速度(一)
這篇文章主要介紹了如何提高lucene的搜尋速度。介紹的大部分思路都是很容易嘗試的,當然另外一部分可能會加大你程式的複雜度。所以請確認搜尋速度確實很慢,而且很慢的原因確實是因為lucene自身而造成的。推薦姐妹篇 如何提高和優化lucene索引速度 遠端檔案系統一般來說都會降低搜尋速度。如果索引必須...
Lucene搜尋優化技巧 索引篇
索引 1 t.termtext 替換為new string t.termbuffer 0,t.termlength 2 stringreader 和tokenstream物件都需要close 3 索引時document只用乙個 field只用幾個 乙個document物件對應多個field例項 fi...
lucene 對多個索引的搜尋和多執行緒搜尋
1 如果應用程式架構由多個lucene索引組成,則可以通過mutltisearcher把所有索引搜尋。也可以通過parallelmultisearcher進行多執行緒搜尋。在單核的情況下,multisearcher比parallelmultisearcher效能更高。2 multisearcher ...