您的方法实际上是好的。一些流行的框架(例如Compass)正在较低级别执行您描述的内容,以自动反映通过ORM框架执行的索引更改(请参阅http://www.compass-
project.org/overview.html)。
除了您要描述的内容之外,我还将定期重新索引MongoDB中的所有数据,以确保Solr和Mongo都同步(可能不像您想的那样长,具体取决于文档数量,字段数,每个字段的令牌数和分析器的性能:使用复杂的分析器,我经常在不到15分钟的时间内创建5到8百万个文档的索引(大约20个字段,但是文本字段很短)您的RAM缓冲区不会太小,并且在添加所有文档之前不要提交/优化)。
关于性能,提交是昂贵的,而优化是非常昂贵的。根据最重要的事情,您可以更改Solrconfig.xml中的mergefactor的值(高的值可以提高写入性能,而低的值可以提高读取性能,最好从10开始)。
您似乎担心索引建立时间。但是,由于Lucene索引存储是基于段的,因此写吞吐量不应过多地依赖于索引的大小(http://lucene.apache.org/java/2_3_2/fileformats.html)。但是,预热时间会增加,因此您应确保
- 在solrconfig.xml配置文件中的firstSearcher和newSearcher参数中有一些典型的(特别是用于加载字段缓存的排序),但不是太复杂的查询,
- useColdSearcher设置为
- 假以具有良好的搜索性能,或
- 如果希望以较慢的搜索速度更快地考虑对索引执行的更改,则为true。
此外,如果在将数据写入MongoDB后仅X毫秒后才可以搜索数据,对于您来说可以接受,则可以使用UpdateHandler的commitWithin功能。这样一来,Solr便不必频繁提交。
有关Solr性能因子的更多信息,请参见
http://wiki.apache.org/solr/SolrPerformanceFactors
要删除文档,可以通过文档ID(在schema.xml中定义)或通过查询来删除:http
:
//lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html



