java-MongoDB+;Solr性能
我一直在四处寻找如何将MongoDB与Solr结合使用,这里的一些问题得到了部分回答,但没有什么真正具体的(更像是理论)。在我的应用程序中,我将有很多文档存储在MongoDB中(可能高达数亿),我想对这些文档的某些属性进行全文搜索,所以我想Solr是最好的方法 我想知道的是,我应该如何配置/执行一切,以使其具有良好的性能?现在,我做的是(我知道这不是最优的): 1-在MongoDB中插入对象时,我将其添加到Solr中java-MongoDB+;Solr性能,java,mongodb,solr,Java,Mongodb,Solr,我一直在四处寻找如何将MongoDB与Solr结合使用,这里的一些问题得到了部分回答,但没有什么真正具体的(更像是理论)。在我的应用程序中,我将有很多文档存储在MongoDB中(可能高达数亿),我想对这些文档的某些属性进行全文搜索,所以我想Solr是最好的方法 我想知道的是,我应该如何配置/执行一切,以使其具有良好的性能?现在,我做的是(我知道这不是最优的): 1-在MongoDB中插入对象时,我将其添加到Solr中 SolrServer server = getServer(); SolrIn
SolrServer server = getServer();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
server.add(document);
server.commit();
2-在更新对象的属性时,由于Solr不能只更新一个字段,因此首先从MongoDB检索对象,然后使用object和new的所有属性更新Solr索引,并执行以下操作
StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0);
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
update.add(document);
update.commit();
3-在查询时,首先查询Solr,然后在检索文档列表时SolrDocumentList
我浏览每个文档并:
那么,对于这里描述的每个场景,有人对如何以更有效的方式实现这一点提出了建议吗?当Solr中有很多文档并且一次添加一个文档时,是否希望以一种不需要1小时就可以重建索引的方式执行此操作?我在这里的要求是,用户可能希望一次添加一个文档,多次添加,我希望他们能够在您的方法确实很好之后立即检索它。一些流行的框架(如Compass)正在较低级别上执行您描述的操作,以便自动镜像到通过ORM框架执行的索引更改(请参阅) 除了您所描述的,我还将定期重新索引MongoDB中的所有数据,以确保Solr和Mongo都是同步的(可能没有您想象的那么长,这取决于文档的数量、字段的数量、每个字段的标记数量以及分析器的性能:我经常创建500万到800万个文档的索引(大约20个字段,但文本字段很短)在使用复杂分析器的不到15分钟内,只需确保RAM缓冲区不太小,并且在添加所有文档之前不要提交/优化) 就性能而言,提交代价高昂,而优化代价高昂。根据对您最重要的内容,您可以更改Solrconfig.xml中mergefactor的值(高值可以提高写入性能,而低值可以提高读取性能,10是一个很好的开始值) 您似乎害怕索引构建时间。但是,由于Lucene索引存储是基于段的,所以写入吞吐量不应该太依赖于索引的大小(http://lucene.apache.org/java/2_3_2/fileformats.html)。但是,预热时间会增加,因此您应确保
- solrconfig.xml配置文件中的firstSearcher和newSearcher参数中有一些典型的(尤其是为了加载字段缓存而进行的排序)但不太复杂的查询
- useColdSearcher设置为
- 为具有良好的搜索性能而设置为false,或
- 如果希望以较慢的搜索速度为代价更快地考虑对索引执行的更改,则为true
每个文档和您要索引的属性有多大?@JustinThomas-每个文档可以有大约10个属性,其中一些可以是长描述,我想对描述进行全文搜索索引,只需对其他描述进行精确匹配。这回答了您的问题吗?删除的要点很好ById
,我实际上没有看到它(我甚至没有尝试,我必须说,我认为有更复杂的东西)。既然你似乎对此很了解,如果你不介意的话,还有几个问题:1.一个好的RAM缓冲区有多少?2.我没有为示例solrconfig.xml文件更改firstSearcher和newSearcher,它们是否良好?3.最后,我有一个solr实例在tomcat下运行,其中有5个内核。它是否改变了性能o是否有多个solr实例正在运行?感谢您的帮助1.您需要执行一些基准测试,以找到最佳的缓冲区大小。我建议您从32M开始,并在每次迭代时将RAM缓冲区的可用内存量增加一倍,在增加RAM缓冲区大小不会产生任何显著改善时停止。2.它们不是t:加载字段缓存(排序和函数查询等所需)需要Solr花费时间,因此,在新索引上使用字段缓存的第一个查询将有性能损失,因此您需要放置将加载这些字段缓存的查询(只需在newSearcher和firstSearcher中放置一个查询,该查询将在应用程序将要执行的相同字段上执行排序)。3.我认为最好只运行一个实例:一些内存