Votre approche est vraiment bonne. Certains frameworks populaires comme Compass exécutent ce que vous décrivez à un niveau inférieur afin de refléter automatiquement les modifications d'index qui ont été effectuées via le framework ORM (voir http://www.compass-project.org/overview.html).
En plus de ce que vous décrivez, je réindexerais également régulièrement toutes les données qui résident dans MongoDB afin de garantir que Solr et Mongo sont synchronisés (probablement pas aussi longtemps que vous pourriez le penser, selon le nombre de documents, le nombre de champs, le nombre de jetons par champ et la performance des analyseurs :je crée souvent des index de 5 à 8 millions de documents (environ 20 champs, mais les champs texte sont courts) en moins de 15 minutes avec des analyseurs complexes, il suffit de s'assurer votre tampon RAM n'est pas trop petit et ne validez/optimisez pas tant que tous les documents n'ont pas été ajoutés).
Concernant les performances, un commit coûte cher et une optimisation est très coûteuse. En fonction de ce qui compte le plus pour vous, vous pouvez modifier la valeur de mergefactor dans Solrconfig.xml (des valeurs élevées améliorent les performances d'écriture tandis que des valeurs faibles améliorent les performances de lecture, 10 est une bonne valeur pour commencer).
Vous semblez avoir peur du temps de construction de l'index. Cependant, comme le stockage des index Lucene est basé sur les segments, le débit d'écriture ne doit pas trop dépendre de la taille de l'index (http://lucene.apache.org/java/2_3_2/fileformats.html). Cependant, le temps de préchauffage augmentera, vous devez donc vous assurer que
- il y a des requêtes typiques (surtout pour les tris afin de charger les fieldcaches) mais pas trop complexes dans les paramètres firstSearcher et newSearcher de votre fichier de configuration solrconfig.xml,
- useColdSearcher est défini sur
- false afin d'avoir de bonnes performances de recherche, ou
- true si vous souhaitez que les modifications apportées à l'index soient prises en compte plus rapidement au prix d'une recherche plus lente.
De plus, s'il est acceptable pour vous que les données deviennent consultables seulement quelques X millisecondes après leur écriture dans MongoDB, vous pouvez utiliser la fonctionnalité commitWithin de UpdateHandler. De cette façon, Solr devra s'engager moins souvent.
Pour plus d'informations sur les facteurs de performance Solr, voirhttp://wiki.apache.org/solr/SolrPerformanceFactors
Pour supprimer des documents, vous pouvez soit supprimer par ID de document (tel que défini dans schema.xml) ou par requête :http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html