优化PDF文字搜索

时间:2011-10-14 15:58:23

标签: java pdf lucene

我有一个应用程序迭代pdf文件目录并搜索字符串。我正在使用PDFBox从PDF中提取文本,代码非常简单。首先要搜索13个文件,花费一分钟时间来加载结果,但我注意到PDFBox在日志文件文件中放了很多东西。我改变了日志记录级别,这有很多帮助但是加载页面仍然需要30秒以上。有没有人对如何优化代码或其他方式确定文档中有多少匹配有任何建议?我玩过Lucene,但它似乎只给你一个目录中的点击次数而不是特定文件中的点击次数。

这是我的代码,用于从PDF中获取文本。

public static String parsePDF (String filename) throws IOException 
 {

    FileInputStream fi = new FileInputStream(new File(filename));       

    PDFParser parser = new PDFParser(fi);   
    parser.parse();   
    COSDocument cd = parser.getDocument();   
    PDFTextStripper stripper = new PDFTextStripper();   
    String pdfText = stripper.getText(new PDDocument(cd));  

    cd.close();

    return pdfText;
 }

1 个答案:

答案 0 :(得分:0)

Lucene允许您单独索引每个文档。
而不是直接使用PDFBox。您可以使用Apache Tika提取文本并将其提供给lucene。 Tika内部使用PDFBox。但是,它提供了易于使用的API以及无缝地从any types文档中提取内容的能力 为目录中的每个文件创建每个lucene文档后,可以对整个索引执行搜索 Lucene匹配搜索词,并返回与文档中内容匹配的结果(文件)数 也可以使用lucene api获取每个lucene文档/文件中的命中。 这称为术语频率,可以针对正在搜索的文档和字段进行计算。

来自In a Lucene / Lucene.net search, how do I count the number of hits per document?

的示例
List docIds = // doc ids for documents that matched the query, 
              // sorted in ascending order 

int totalFreq = 0;
TermDocs termDocs = reader.termDocs();
termDocs.seek(new Term("my_field", "congress"));
for (int id : docIds) {
    termDocs.skipTo(id);
    totalFreq += termDocs.freq();
}