Ответ 1
Ваш подход действительно хорош. Некоторые популярные структуры, такие как Compass, выполняют то, что вы описываете на более низком уровне, чтобы автоматически зеркально отражать изменения индекса, которые были выполнены через структуру ORM (см. http://www.compass-project.org/overview.html).
В дополнение к тому, что вы описали, я бы также регулярно переиндексировал все данные, которые живут в MongoDB, чтобы синхронизировать Solr и Mongo (возможно, не так долго, как вы думаете, в зависимости от числа документа, количество полей, количество токенов на поле и производительность анализаторов: я часто создаю индекс от 5 до 8 миллионов документов (около 20 полей, но текстовые поля короткие) менее чем за 15 минут со сложными анализаторами, просто убедитесь, что буфер RAM не слишком мал и не выполняйте/оптимизируйте, пока не будут добавлены все документы).
Что касается производительности, фиксация стоит дорого, а оптимизация очень дорогостоящая. В зависимости от того, что наиболее важно для вас, вы можете изменить значение mergefactor в Solrconfig.xml(высокие значения улучшают производительность записи, тогда как низкие значения улучшают производительность чтения, 10 - хорошее значение для начала).
Вы, кажется, боитесь времени сборки индекса. Однако, поскольку хранилище индексов Lucene основано на сегментах, пропускная способность записи не должна зависеть слишком сильно от размера индекса (http://lucene.apache.org/java/2_3_2/fileformats.html). Однако время прогрева будет увеличиваться, поэтому вы должны убедиться, что
- существуют типичные (особенно для сортировки для загрузки полевых кэшей), но не слишком сложные запросы в параметрах firstSearcher и newSearcher в файле конфигурации solrconfig.xml,
- useColdSearcher установлен в
- false, чтобы иметь хорошую производительность поиска или
- true, если вы хотите, чтобы изменения, выполненные с индексом, учитывались быстрее в зависимости от более медленного поиска.
Кроме того, если это приемлемо для вас, если данные становятся доступными для поиска всего за несколько миллисекунд после того, как они были записаны в MongoDB, вы можете использовать функцию commitWithin для UpdateHandler. Таким образом, Solr придется совершать реже.
Для получения дополнительной информации о коэффициентах производительности Solr см. http://wiki.apache.org/solr/SolrPerformanceFactors
Чтобы удалить документы, вы можете либо удалить идентификатор документа (как определено в schema.xml), либо по запросу: http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html