Twoje podejście jest naprawdę dobre. Niektóre popularne frameworki, takie jak Compass, wykonują to, co opisujesz na niższym poziomie, aby automatycznie odzwierciedlać zmiany indeksu, które zostały wykonane za pośrednictwem frameworka ORM (zobacz http://www.compass-project.org/overview.html).
Oprócz tego, co opisujesz, regularnie ponownie indeksuję wszystkie dane znajdujące się w MongoDB, aby zapewnić synchronizację zarówno Solr, jak i Mongo (prawdopodobnie nie tak długo, jak myślisz, w zależności od liczby dokumentów, liczba pól, liczba tokenów na pole i wydajność analizatorów:często tworzę indeks od 5 do 8 milionów dokumentów (około 20 pól, ale pola tekstowe są krótkie) w mniej niż 15 minut przy złożonych analizatorach, po prostu upewnij się twój bufor RAM nie jest zbyt mały i nie zatwierdzaj/optymalizuj, dopóki wszystkie dokumenty nie zostaną dodane).
Jeśli chodzi o wydajność, zatwierdzenie jest kosztowne, a optymalizacja bardzo kosztowna. W zależności od tego, co jest dla Ciebie najważniejsze, możesz zmienić wartość mergefactor w Solrconfig.xml (wysokie wartości poprawiają wydajność zapisu, a niskie poprawiają wydajność odczytu, 10 to dobra wartość na początek).
Wydaje się, że boisz się czasu budowania indeksu. Ponieważ jednak przechowywanie indeksów Lucene jest oparte na segmentach, przepustowość zapisu nie powinna za bardzo zależeć od rozmiaru indeksu (http://lucene.apache.org/java/2_3_2/fileformats.html). Jednak czas nagrzewania się wydłuży, dlatego należy upewnić się, że
- w parametrach firstSearcher i newSearcher w pliku konfiguracyjnym solrconfig.xml występują typowe (szczególnie dla sortowania w celu załadowania pamięci podręcznych), ale niezbyt złożone zapytania,
- useColdSearcher jest ustawiony na
- fałsz, aby zapewnić dobrą wydajność wyszukiwania, lub
- prawda, jeśli chcesz, aby zmiany wprowadzone w indeksie były uwzględniane szybciej za cenę wolniejszego wyszukiwania.
Co więcej, jeśli akceptujesz dane, które można przeszukiwać zaledwie kilka X milisekund po ich zapisaniu w MongoDB, możesz użyć funkcji commitWithin programu UpdateHandler. W ten sposób Solr będzie musiał rzadziej dokonywać commitów.
Więcej informacji na temat współczynników wydajności Solr można znaleźć na stronie http://wiki.apache.org/solr/SolrPerformanceFactors
Aby usunąć dokumenty, możesz je usunąć według identyfikatora dokumentu (zgodnie z definicją w schema.xml) lub za pomocą zapytania:http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html