0 lucene
我正在尝试构建大约 5000 个文档的 Lucene 索引,并且正在创建的索引似乎变得太大。我想知道是否有办法减少索引的大小。
我使用的是 Lucene 4.10,我想要索引的文档有多种格式(.docx、.xlsx、.pdf、.rtf、.txt)。包含我正在索引的文档的目录大小约为 1Gb。对 3000/5000 个文档建立索引后,索引大小已经是 10Gb。我还没有找到任何关于目录大小与索引大小的正常比率的有用信息,但 10Gb 的索引对于仅 1Gb 的文档来说似乎太大了。
为了阅读文档,我使用 Tika 1.6 AutoDetectParser 生成一个包含每个文档内容的字符串。
以下片段显示了我如何尝试构建索引。创建索引编写器后,它调用 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用 StopAnalyzer 并使用 Field.Store.NO 参数创建内容字段。我找不到关于减少索引大小的其他有用信息。我也有兴趣知道是否有人有关于索引与索引文档总大小相比有多大的真实数据。
我认为你遇到了编码问题,而不是 Lucene 问题。
您正在创建一个文档“addDoc”,并在将所有文档添加到索引时重新使用它。不一定是个坏主意(尽管我可能不会打扰)。但您似乎没有做的是在添加另一个文档之前清除数据。因此,这将导致添加的每个后续文档都包含前面文档的所有数据。
最简单的更改是每次阅读文档时创建一个新文档并将其添加到索引中。手指交叉,你的食指尺寸将会直线下降。
祝你好运,
| 归档时间: |
|
| 查看次数: |
1995 次 |
| 最近记录: |