lucene索引合并与增量索引
利用 Lucene,在創(chuàng)建索引的工程中你可以充分利用機器的硬件資源來提高索引的效率。當你需要索引大量的文件時,你會注意到索引過程的瓶頸是在往磁盤上寫索引文件的過程中。為了解決這個問題, Lucene 在內存中持有一塊緩沖區(qū)。但我們如何控制 Lucene 的緩沖區(qū)呢?幸運的是,Lucene 的類 IndexWriter 提供了三個參數(shù)用來調整緩沖區(qū)的大小以及往磁盤上寫索引文件的頻率。
1.合并因子(mergeFactor)
這 個參數(shù)決定了在 Lucene 的一個索引塊中可以存放多少文檔以及把磁盤上的索引塊合并成一個大的索引塊的頻率。比如,如果合并因子的值是 10,那么當內存中的文檔數(shù)達到 10 的時候所有的文檔都必須寫到磁盤上的一個新的索引塊中。并且,如果磁盤上的索引塊的隔數(shù)達到 10 的話,這 10 個索引塊會被合并成一個新的索引塊。這個參數(shù)的默認值是 10,如果需要索引的文檔數(shù)非常多的話這個值將是非常不合適的。對批處理的索引來講,為這個參數(shù)賦一個比較大的值會得到比較好的索引效果。
2.最小合并文檔數(shù)
這個參數(shù)也會影響索引的性能。它決定了內存中的文檔數(shù)至少達到多少才能將它們寫回磁盤。這個參數(shù)的默認值是10,如果你有足夠的內存,那么將這個值盡量設的比較大一些將會顯著的提高索引性能。
3.最大合并文檔數(shù)
這個參數(shù)決定了一個索引塊中的最大的文檔數(shù)。它的默認值是 Integer.MAX_VALUE,將這個參數(shù)設置為比較大的值可以提高索引效率和檢索速度,由于該參數(shù)的默認值是整型的最大值,所以我們一般不需要改動這個參數(shù)。?
???? //indexDir is the directory that hosts Lucene's index files
???? File??? indexDir = new File("C://luceneIndex");
???? Analyzer luceneAnalyzer = new StandardAnalyzer();
???? File[] textFiles?? = fileDir.listFiles();
???? long startTime = new Date().getTime();
???? int mergeFactor = 10;
???? int minMergeDocs = 10;
???? int maxMergeDocs = Integer.MAX_VALUE;
???? IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);????????
???? indexWriter.mergeFactor = mergeFactor;
???? indexWriter.minMergeDocs = minMergeDocs;
???? indexWriter.maxMergeDocs = maxMergeDocs;
???? //Add documents to the index
???? for(int i = 0; i?? > textFiles[i].getName().endsWith(".txt")){
???????? Reader textReader = new FileReader(textFiles[i]);
???????? Document document = new Document();
???????? document.add(Field.Text("content",textReader));
???????? document.add(Field.Keyword("path",textFiles[i].getPath()));
???????? indexWriter.addDocument(document);
?????? }
???? }
???? indexWriter.optimize();
???? indexWriter.close();
???? long endTime = new Date().getTime();
???? System.out.println("MergeFactor: " + indexWriter.mergeFactor);
???? System.out.println("MinMergeDocs: " + indexWriter.minMergeDocs);
???? System.out.println("MaxMergeDocs: " + indexWriter.maxMergeDocs);
???? System.out.println("Document number: " + textFiles.length);
???? System.out.println("Time consumed: " + (endTime - startTime) + " milliseconds");
?? }
}
判斷索引目錄的segments文件是否存在,
??? 如果存在,用增量索引
??????? 否則, 重新創(chuàng)建索引
?如果是重新創(chuàng)建索引
??? 只需要遍歷需要索引的內容,然后新增文檔
????????
?如果是增量索引
??? 判斷主Key[文件名(包含全路徑)]在索引中是否存在
??????? 如果存在
??????????? 判斷[文件的修改時間],是否和索引中保存的[修改時間]一致
??????????? 如果不一致
??????????????? 刪除舊的索引中的該索引項目
??????????????? 新增對該文檔的索引
?????? 否則
??????????? 新增該文檔的索引 缺點,不能發(fā)現(xiàn)已經(jīng)刪除的文件,當然是認為的去某個目錄刪除該文件。
????? 如果是程序的話當然是可以的,只需要把索引中的項目刪除。?
?
總結
以上是生活随笔為你收集整理的lucene索引合并与增量索引的全部內容,希望文章能夠幫你解決所遇到的問題。