Подходът ти всъщност е добър. Някои популярни рамки като 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, ако искате промените, извършени в индекса, да се вземат предвид по-бързо с цената на по-бавно търсене.
Освен това, ако е приемливо за вас, ако данните станат достъпни за търсене само няколко X милисекунди след като са били записани в 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