У меня есть большое количество документов (более миллиона), которые мне нужно регулярно проверять и сопоставлять с 100 «ключевыми словами с несколькими словами» (т. Е. Не только такие ключевые слова, как «фильмы» «но и« северный американец »). У меня есть следующий код, который отлично работает с одиночными словами ключевыми словами (то есть «книга»):Сканирование большого количества документов для десятков слов
/**
* Scan a text for certain keywords
* @param keywords the list of keywords we are searching for
* @param text the text we will be scanning
* @return a list of any keywords from the list which we could find in the text
*/
public static List<String> scanWords(List<String> keywords, String text) {
// prepare the BreakIterator
BreakIterator wb = BreakIterator.getWordInstance();
wb.setText(text);
List<String> results = new ArrayList<String>();
// iterate word by word
int start = wb.first();
for (int end = wb.next(); end != BreakIterator.DONE; start = end, end = wb.next()) {
String word = text.substring(start, end);
if (!StringUtils.isEmpty(word) && keywords.contains(word)){
// we have this word in our keywords so return it
results.add(word);
}
}
return results;
}
Примечание: Мне нужен этот код, чтобы быть как можно более эффективными, поскольку количество документов очень велико.
В моем текущем коде не найдено ни одного из двух ключевых слов ключевого слова. Любая идея о том, как исправить? Я также прекрасно понимаю совершенно другой подход.
Почему бы вам не попробовать [Lucene] (http://lucene.apache.org/) для такой задачи? –
Да, вероятно, было бы лучше использовать систему индексирования, которая поддерживает файлы. Кстати, какой текст вам нужен миллион файлов? Если каждый содержит 10 слов, это 10 миллионов слов. Представьте себе ввод-вывод, чтобы открыть или закрыть их. – sln
Мне нужно хранить только найденные ключевые слова в моем db. Индексирование не является решением. – checklist