我正在尝试构建一个大约5000个文档的Lucene索引,并且正在创建的索引似乎变得太大了。我想知道是否有办法减少索引的大小。
我正在使用Lucene 4.10,我要索引的文档是各种格式(.docx,.xlsx,.pdf,.rtf,.txt)。包含我正在编制索引的文档的目录大小约为1Gb。索引3000/5000文档后,索引大小已经是10Gb。我没有找到有关目录大小与索引大小的正常比率的任何有用信息,但10Gb索引似乎对于仅1Gb的文档来说太大了。
要阅读文档,我使用Tika 1.6 AutoDetectParser生成包含每个文档内容的字符串。
以下snipplet显示了我正在尝试构建索引的方法。创建索引编写器后,它调用一个方法walkFiles()来遍历文档目录,读入每个文档(使用“DocReader”类)并将其添加到索引中:
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。我找不到有关减少索引大小的其他有用信息。我也有兴趣知道是否有人有关于索引与索引文档总大小相比有多大的真实世界数据。
答案 0 :(得分:4)
我认为你有编码问题,而不是Lucene问题。
您正在创建单个文档“addDoc”并在将所有文档添加到索引时重新使用它。不一定是个坏主意(虽然,我可能不会打扰)。但是你似乎没有做的是在添加另一个文档之前清除数据。这样就可以添加每个连续的文档,其中包含前面文档的所有数据。
要做的最简单的更改是每次读取文档时只创建一个新文档,然后将其添加到索引中。手指交叉,指数的大小将直线下降。
祝你好运,