2014-09-25 137 views
0

我正在嘗試構建大約5000個文檔的Lucene索引,並且正在創建的索引似乎變得太大。我想知道是否有辦法縮小索引的大小。Lucene索引大小太大

我使用的是Lucene 4.10,我想索引的文檔是各種格式(.docx,.xlsx,.pdf,.rtf,.txt)。包含我索引文檔的目錄大小約爲1Gb。索引3000/5000文檔後,索引大小已經是10Gb。我還沒有找到任何關於目錄大小與索引大小之間的正常比例的有用信息,但10Gb索引似乎對於僅1Gb的文檔來說太大了。

要閱讀文檔,我使用Tika 1.6 AutoDetectParser生成一個包含每個文檔內容的字符串。

下面的snipplet顯示了我正試圖建立一個索引。創建索引作家後,它會調用一個方法walkFiles()遍歷文件目錄,讀取每個文件(使用「文件閱讀器」類),並將其添加到索引:

public void indexDocs() { 
    docDir = "C:/MyDocDir"; 
    indexPath = "C:/DocIndex"; 

    docIndexDir = FSDirectory.open(new File(indexPath)); 

    analysis = new StopAnalyzer(); 
    iwc = new IndexWriterConfig(Version.LUCENE_4_10_0, analysis); 

    iwc.setOpenMode(OpenMode.CREATE);  
    docIndex = new IndexWriter(docIndexDir, iwc); 

    addDoc = new Document(); 
    walkFiles(docDir); 
    docIndex.close(); 
} 


private void walkFiles(String docDir) { 
    File docRoot = new File(docDir); 
    File[] list = docRoot.listFiles(); 

    if (list == null) return; 

    for (File f : list) { 
     if (f.isDirectory()) { 
      walkFiles(f.getAbsolutePath()); 
     } 
     else { 
      String docName = f.getAbsolutePath(); 
      DocReader readDoc = new DocReader(docName); 

      if (readDoc.readFile()) { 
       String docPath = readDoc.getPath(); 
       String docText = readDoc.getText(); 

       Field pathField = new StringField("path", docPath, Field.Store.NO); 
       Field contentField = new TextField("contents", docText, Field.Store.NO); 

       addDoc.add(pathField); 
       addDoc.add(contentField); 

       docIndex.addDocument(addDoc); 
      } 

     } 
    } 
} 

請注意,我使用StopAnalyzer並使用Field.Store.NO參數創建內容Field。我找不到其他有用的信息來減少索引大小。我也很想知道,如果任何人都有真實世界的數字,指出索引與索引文檔的總大小相比有多大。

回答

4

我認爲你有一個編碼問題,而不是一個Lucene問題。

您正在創建單個文檔「addDoc」,並在將所有文檔添加到索引時重新使用它。不一定是個壞主意(雖然我可能不會打擾)。但是你似乎沒有做的是在添加另一個文檔之前清除數據。所以這將導致每個連續的文件被添加包含所有前面的文件的數據。

要做出最簡單的更改就是在每次閱讀文檔時創建一個新文檔並將其添加到索引中。手指交叉,你的指數的大小會直線下降。

祝你好運,

+0

是的,事實證明,這是問題。謝謝您的幫助! – linuxguru 2014-09-29 01:20:47