lucene索引合并与增量索引
利用 Lucene,在創(chuàng)建索引的工程中你可以充分利用機(jī)器的硬件資源來(lái)提高索引的效率。當(dāng)你需要索引大量的文件時(shí),你會(huì)注意到索引過(guò)程的瓶頸是在往磁盤(pán)上寫(xiě)索引文件的過(guò)程中。為了解決這個(gè)問(wèn)題, Lucene 在內(nèi)存中持有一塊緩沖區(qū)。但我們?nèi)绾慰刂?Lucene 的緩沖區(qū)呢?幸運(yùn)的是,Lucene 的類(lèi) IndexWriter 提供了三個(gè)參數(shù)用來(lái)調(diào)整緩沖區(qū)的大小以及往磁盤(pán)上寫(xiě)索引文件的頻率。
1.合并因子(mergeFactor)
這 個(gè)參數(shù)決定了在 Lucene 的一個(gè)索引塊中可以存放多少文檔以及把磁盤(pán)上的索引塊合并成一個(gè)大的索引塊的頻率。比如,如果合并因子的值是 10,那么當(dāng)內(nèi)存中的文檔數(shù)達(dá)到 10 的時(shí)候所有的文檔都必須寫(xiě)到磁盤(pán)上的一個(gè)新的索引塊中。并且,如果磁盤(pán)上的索引塊的隔數(shù)達(dá)到 10 的話(huà),這 10 個(gè)索引塊會(huì)被合并成一個(gè)新的索引塊。這個(gè)參數(shù)的默認(rèn)值是 10,如果需要索引的文檔數(shù)非常多的話(huà)這個(gè)值將是非常不合適的。對(duì)批處理的索引來(lái)講,為這個(gè)參數(shù)賦一個(gè)比較大的值會(huì)得到比較好的索引效果。
2.最小合并文檔數(shù)
這個(gè)參數(shù)也會(huì)影響索引的性能。它決定了內(nèi)存中的文檔數(shù)至少達(dá)到多少才能將它們寫(xiě)回磁盤(pán)。這個(gè)參數(shù)的默認(rèn)值是10,如果你有足夠的內(nèi)存,那么將這個(gè)值盡量設(shè)的比較大一些將會(huì)顯著的提高索引性能。
3.最大合并文檔數(shù)
這個(gè)參數(shù)決定了一個(gè)索引塊中的最大的文檔數(shù)。它的默認(rèn)值是 Integer.MAX_VALUE,將這個(gè)參數(shù)設(shè)置為比較大的值可以提高索引效率和檢索速度,由于該參數(shù)的默認(rèn)值是整型的最大值,所以我們一般不需要改動(dòng)這個(gè)參數(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)建索引
??? 只需要遍歷需要索引的內(nèi)容,然后新增文檔
????????
?如果是增量索引
??? 判斷主Key[文件名(包含全路徑)]在索引中是否存在
??????? 如果存在
??????????? 判斷[文件的修改時(shí)間],是否和索引中保存的[修改時(shí)間]一致
??????????? 如果不一致
??????????????? 刪除舊的索引中的該索引項(xiàng)目
??????????????? 新增對(duì)該文檔的索引
?????? 否則
??????????? 新增該文檔的索引 缺點(diǎn),不能發(fā)現(xiàn)已經(jīng)刪除的文件,當(dāng)然是認(rèn)為的去某個(gè)目錄刪除該文件。
????? 如果是程序的話(huà)當(dāng)然是可以的,只需要把索引中的項(xiàng)目刪除。?
?
總結(jié)
以上是生活随笔為你收集整理的lucene索引合并与增量索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。