Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-MongoDB+;Solr性能_Java_Mongodb_Solr - Fatal编程技术网

java-MongoDB+;Solr性能

java-MongoDB+;Solr性能,java,mongodb,solr,Java,Mongodb,Solr,我一直在四处寻找如何将MongoDB与Solr结合使用,这里的一些问题得到了部分回答,但没有什么真正具体的(更像是理论)。在我的应用程序中,我将有很多文档存储在MongoDB中(可能高达数亿),我想对这些文档的某些属性进行全文搜索,所以我想Solr是最好的方法 我想知道的是,我应该如何配置/执行一切,以使其具有良好的性能?现在,我做的是(我知道这不是最优的): 1-在MongoDB中插入对象时,我将其添加到Solr中 SolrServer server = getServer(); SolrIn

我一直在四处寻找如何将MongoDB与Solr结合使用,这里的一些问题得到了部分回答,但没有什么真正具体的(更像是理论)。在我的应用程序中,我将有很多文档存储在MongoDB中(可能高达数亿),我想对这些文档的某些属性进行全文搜索,所以我想Solr是最好的方法

我想知道的是,我应该如何配置/执行一切,以使其具有良好的性能?现在,我做的是(我知道这不是最优的):

1-在MongoDB中插入对象时,我将其添加到Solr中

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
我浏览每个文档并:

  • 获取文档的id
  • 从MongoDB获取具有相同id的对象,以便能够从中检索属性
  • 4-删除时,我还没有完成这部分,也不确定如何在Java中完成


    那么,对于这里描述的每个场景,有人对如何以更有效的方式实现这一点提出了建议吗?当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
    此外,如果数据在写入MongoDB后的几X毫秒内就可以搜索,那么您可以使用UpdateHandler的commitWithin功能,这样Solr提交的频率就会降低

    有关Solr性能因素的更多信息,请参阅

    要删除文档,可以按文档ID(如schema.xml中定义的)或按查询进行删除:

  • 您还可以等待更多文档,并且每X分钟只为它们编制一次索引。(当然,这在很大程度上取决于您的应用程序和需求)

  • 如果您的文档很小,并且不需要所有数据(存储在MongoDB中),您可以通过存储它们而不是索引,将所需的字段仅放在Solr文档中


  • 每个文档和您要索引的属性有多大?@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.我认为最好只运行一个实例:一些内存