Оптимизировать поиск слов в PDF - PullRequest
0 голосов
/ 14 октября 2011

У меня есть приложение, которое перебирает каталог файлов 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 голосов
/ 15 октября 2011

Lucene позволит вам индексировать каждый документ отдельно.
Вместо непосредственного использования PDFBox.Вы можете использовать Apache Tika для извлечения текста и подачи его в люцен.Тика использует PDFBox внутри.Тем не менее, он предоставляет простой в использовании API, а также возможность извлекать содержимое из любого типа документа без проблем.
Как только у вас есть каждый документ lucene для каждого файла в вашем каталоге, вы можете выполнять поискпо полному индексу.
Lucene сопоставляет поисковый запрос и возвращает количество результатов (файлов), которые соответствуют содержанию в документе.
Также возможно получить совпадения в каждом документе / файле Luceneиспользуя Lucene API.Это называется термином «частота», и его можно рассчитать для документа и поля, в которых выполняется поиск.

Пример из В поиске Lucene / Lucene.net как подсчитать количество попаданий на документ?

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...