Мы выполняем полные переиндексации каждые 7 дней (т.е. создаем индекс с нуля) по нашему индексу Lucene и инкрементным индексам каждые 2 часа или около того. Наш индекс насчитывает около 700 000 документов, а полный индекс занимает около 17 часов (что не является проблемой).
Когда мы делаем инкрементные индексы, мы только индексируем контент, который изменился за последние два часа, поэтому требуется гораздо меньше времени - около получаса. Тем не менее, мы заметили, что много времени (возможно, 10 минут) тратится на метод IndexWriter.optimize().
LuceneFAQ упоминает, что:
Класс IndexWriter поддерживает метод optimize(), который уплотняет базу данных индексов и ускоряет запросы. Вы можете использовать этот метод после полной индексации вашего набора документов или после инкрементных обновлений индекса. Если ваше инкрементное обновление часто добавляет документы, вы хотите выполнить оптимизацию только один раз в то время, чтобы избежать дополнительных накладных расходов на оптимизацию.
... но это, похоже, не дает никакого определения того, что означает "часто". Оптимизация - интенсивность процессора и ОЧЕНЬ интенсивная интенсивность ввода-вывода, поэтому мы предпочли бы не делать этого, если мы сможем справиться с этим. Сколько стоит запуск запросов на не оптимизированном индексе (я думаю, особенно в отношении производительности запросов после полного повторного индекса по сравнению с после 20 инкрементными индексами, где, скажем, было изменено 50 000 документов)? Должны ли мы оптимизировать после каждого инкрементного индекса, или это поражение производительности не стоит?