При индексации документа выполняется несколько шагов:
- документ анализируется,
- данные помещаются в буфер ОЗУ,
- , когдаБуфер ОЗУ заполнен, данные сбрасываются в новый сегмент на диске,
- , если имеется более $ {mergeFactor} сегментов, сегменты объединяются.
Первые два шага будутзапускать столько потоков, сколько у вас клиентов, отправляющих данные в Solr, поэтому если вы хотите, чтобы Solr запускал три потока для этих шагов, все, что вам нужно, это отправлять данные в Solr из трех потоков.
Вы можете настроитьколичество потоков, которое нужно использовать для четвертого шага, если вы используете ConcurrentMergeScheduler (http://lucene.apache.org/java/3_0_1/api/core/org/apache/lucene/index/ConcurrentMergeScheduler.html). Однако нет смысла настраивать максимальное количество потоков для использования из файлов конфигурации Solr, поэтому вам нужно написать собственный класс, которыйвызовите setMaxThreadCount в конструкторе.
Мой опыт показывает, что основными способами повышения скорости индексации с помощью Solr являются:
- покупка более быстрого оборудования (особенно ввод / вывод), * 1021 *
- отправка данных в Solr из нескольких потоков (столько потоков, сколько ядер - хорошее начало),
- с использованием формата Javabin,
- с использованием более быстрогоанализаторы.
Хотя StreamingUpdateSolrServer выглядит интересным для повышения производительности индексирования, не поддерживает формат Javabin .Поскольку разбор Javabin на намного быстрее, чем разбор XML, я получил лучшую производительность, посылая массовые обновления (800 в моем случае, но с довольно небольшими документами), используя CommonsHttpSolrServer и формат Javabin.
Youможно прочитать http://wiki.apache.org/lucene-java/ImproveIndexingSpeed для получения дополнительной информации.