Je aanpak is eigenlijk goed. Sommige populaire frameworks zoals Compass voeren wat je beschrijft op een lager niveau uit om automatisch te spiegelen aan de indexwijzigingen die zijn uitgevoerd via het ORM-framework (zie http://www.compass-project.org/overview.html).
Naast wat je beschrijft, zou ik ook regelmatig alle gegevens die in MongoDB leven opnieuw indexeren om ervoor te zorgen dat zowel Solr als Mongo worden gesynchroniseerd (waarschijnlijk niet zo lang als je zou denken, afhankelijk van het aantal documenten, het aantal velden, het aantal tokens per veld en de prestaties van de analysers:ik maak vaak een index van 5 tot 8 miljoen documenten (ongeveer 20 velden, maar tekstvelden zijn kort) in minder dan 15 minuten met complexe analysers, zorg er gewoon voor uw RAM-buffer is niet te klein en bewerk/optimaliseer niet totdat alle documenten zijn toegevoegd).
Wat de prestaties betreft, is een commit kostbaar en een optimalisatie erg kostbaar. Afhankelijk van wat voor u het belangrijkst is, kunt u de waarde van mergefactor in Solrconfig.xml wijzigen (hoge waarden verbeteren de schrijfprestaties, terwijl lage waarden de leesprestaties verbeteren, 10 is een goede waarde om mee te beginnen).
Je lijkt bang te zijn voor de opbouwtijd van de index. Aangezien de opslag van Lucene-indexen echter op segmenten is gebaseerd, mag de schrijfsnelheid niet te veel afhangen van de grootte van de index (http://lucene.apache.org/java/2_3_2/fileformats.html). De opwarmtijd zal echter toenemen, dus u moet ervoor zorgen dat
- er zijn typische (vooral voor sorteringen om de veldcaches te laden) maar niet te complexe zoekopdrachten in de parameters firstSearcher en newSearcher in uw configuratiebestand solrconfig.xml,
- useColdSearcher is ingesteld op
- false om goede zoekprestaties te hebben, of
- true als u wilt dat wijzigingen in de index sneller worden verwerkt tegen de prijs van een langzamere zoekopdracht.
Bovendien, als het voor u acceptabel is dat de gegevens slechts een paar X milliseconden nadat ze naar MongoDB zijn geschreven doorzoekbaar worden, kunt u de commitWithin-functie van UpdateHandler gebruiken. Op deze manier hoeft Solr zich minder vaak te committeren.
Voor meer informatie over Solr-prestatiefactoren, zie http://wiki.apache.org/solr/SolrPerformanceFactors
Als u documenten wilt verwijderen, kunt u ofwel op document-ID (zoals gedefinieerd in schema.xml) of op query:http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html