lucene的索引體系是一個寫獨佔,讀共享的結構,這就意味着,咱們在使用多線程進行添加索引時,性能並不會獲得明顯的提高,因此任什麼時候候只能有一個線程對索引進行寫入操做,而保障這個操做的安全性則是來自於,lucene的獨佔鎖機制(寫入操做進行時,咱們能夠在lucene的索引根目錄看到一個命名爲write.lock的鎖文件),若是同一時刻有多個不一樣IndexWriter對索引進行寫入操做,那麼將會引起鎖重疊異常,因此lucene的特殊索引結構,決定了其只能使用一個IndexWriter對索引進行添加操做。
java
即便是限定lucene只能使用一個線程進行寫入操做,lucene的寫入性能也是很是高效的,特別是在lucene4.x以後,更是優異,咱們能夠根據本身服務器的硬件環境,來調優一些參數,利用上批處理的特性,能夠大大提高寫入性能。
數據庫
前面說過,lucene寫入時只能用一個線程操做,那麼加入咱們想使用多線程寫入來提速能夠嗎?
api
答案是確定的,雖然lucene限定只能用一個線程寫入,可是這個限制僅僅指的是對一個索引文件的限制,咱們能夠採起一種折中的方式,利用多線程寫入多個索引文件夾目錄,而後再對這幾個索引文件合併,由此來提高速度,lucene的api也支持多個索引文件的合併,因此採起這種方式來建立索引,也可以大大的提高索引性能,這種方式尤爲適合對於數據庫的數據建索引,咱們能夠採起分頁讀的方式,由某個固定數目的線程來建立索引。
安全
下面介紹如何使用luceneD的api來對多個索引文件進行合併操做,合併操做大多數時候要求咱們的數據結構是一致的,當飯lucene是一種文檔型的鬆散的存儲結構,某個文檔裏也能夠存儲本身特有的字段,而其餘的文檔裏,則沒有,很少既然咱們須要合併,那麼就須要大多數的結構是要一致的,不然兩個徹底不一樣類型的索引,合併到一塊兒是不符合邏輯的。
服務器
下面建立了2分索引,而後對這兩份索引進行合併,截圖以下:數據結構
合併的核心代碼以下:
多線程
/*** * 測試多個索引之間 * 進行合併的方法 * **/ public static void combineMoreIndex(){ try{ Directory d1=FSDirectory.open(new File("E:\\1\\a"));//打開存放索引1的路徑 Directory d2=FSDirectory.open(new File("E:\\2\\a"));//打開存放索引2的路徑 Directory d3=FSDirectory.open(new File("E:\\3\\ab"));//合併到索引3裏面 IndexWriter writer=new IndexWriter(d3, new IndexWriterConfig(Version.LUCENE_44, new IKAnalyzer())); writer.addIndexes(d1,d2);//傳入各自的Diretory或者IndexReader進行合併 writer.commit();//提交索引 writer.close(); System.out.println("合併索引完畢........."); }catch(Exception e){ e.printStackTrace(); } }
生成第三份索引,截圖以下:性能
咱們來看下,合併前,一、2索引和合並後的3索引的數據變化信息測試
System.out.println("==============1a========================="); showAll("E:\\1\\a"); System.out.println("==============2a========================="); showAll("E:\\2\\a"); System.out.println("==============合併後========================="); showAll("E:\\3\\ab");
輸出結果以下,注意裏面有日期爲null的,表明這個文檔沒有日期這個字段。spa
==============1a========================= a===>中國 日期: ===> null b===>法國 日期: ===> 1389783935597 c===>中國 日期: ===> null d===>英國 日期: ===> null ==============2a========================= q===>中國 日期: ===> null w===>法國 日期: ===> 1389783980586 r===>中國 日期: ===> null d===>英國 日期: ===> null ==============合併後========================= a===>中國 日期: ===> null b===>法國 日期: ===> 1389783935597 c===>中國 日期: ===> null d===>英國 日期: ===> null q===>中國 日期: ===> null w===>法國 日期: ===> 1389783980586 r===>中國 日期: ===> null d===>英國 日期: ===> null