Если вы хотите распараллелить индексирование, вы можете сделать две вещи:
- распараллеливание вызовов addDocument,
- увеличение максимального числа потоков вашего планировщика слияния.
Вы находитесь на правильном пути для распараллеливания вызовов addDocuments, но порождение одного потока на документ не будет масштабироваться, поскольку количество документов, которые нужно проиндексировать, будет расти.Вам лучше использовать фиксированный размер ThreadPoolExecutor .Поскольку эта задача в основном требует интенсивной загрузки ЦП (в зависимости от вашего анализатора и способа извлечения данных), установка числа процессоров вашего компьютера в качестве максимального количества потоков может быть хорошим началом.
ОтносительноВ планировщике слияния вы можете увеличить максимальное количество потоков, которое можно использовать с помощью метода setMaxThreadCount из ConcurrentMergeScheduler .Помните, что при последовательном чтении / записи диски гораздо лучше, чем при случайном чтении / записи, поэтому установка слишком большого максимального числа потоков в планировщике слияния скорее приведет к замедлению индексации, чем к ее ускорению.
Но прежде чем пытаться распараллелить процесс индексирования, вам, вероятно, следует попытаться найти узкое место.Если ваш диск слишком медленный, узким местом, вероятно, будут сбрасывание и шаги слияния, вследствие чего распараллеливание вызовов addDocument (который по сути состоит в анализе документа и буферизации результатов анализа в памяти) не улучшит скорость индексациивообще.
Некоторые примечания:
В разрабатываемой версии Lucene ведется некоторая работа по улучшению параллельного индексирования (особенно это касается промывочной части, этой запись в блоге объясняет, как это работает).
У Lucene есть хорошая вики-страница на , как повысить скорость индексации , где вы найдете другие способыулучшить скорость индексации.