当前位置: 首页 > 面试题库 >

Java-MongoDB + Solr性能

朱炜
2023-03-14
问题内容

我一直在四处查看,以了解如何将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中检索对象,然后使用对象和新属性中的所有属性更新Solr索引,并执行类似的操作

StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0);
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
update.add(document);
update.commit();

3-查询时,首先查询Solr,然后在检索文档列表时SolrDocumentList浏览每个文档,并且:

  1. 获取文件ID
  2. 从MongoDB获得具有相同ID的对象,以便能够从那里检索属性

4-删除时,我还没有完成那部分,也不确定如何在Java中完成

因此,对于在此描述的每个方案,有人对如何以更有效的方式执行此操作有建议吗?是否喜欢这样的过程:在Solr中有很多文档并一次添加一个文档时,无需花费1个小时即可重建索引?我在这里的要求是,用户可能希望一次,多次添加一个文档,我希望他们能够在之后立即检索该文档。


问题答案:

您的方法实际上是好的。一些流行的框架(例如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



 类似资料:
  • 驱动程序版本为: 我的问题是,当我使用api find和一些来自java的过滤器时,操作需要15秒。 我检查了mongo服务器日志文件,发现跟踪是一个命令,而不是一个查询: 2015-09-01T12:11:47.496+0200I命令[conn503]命令b.$CMD命令:计数{count:“logs”,查询:{timestamp:{$GTE:新日期(1433109600000)},aplica

  • 当我使用提供的Apache SOLR启动脚本(版本6.6.0)时,该脚本会创建并执行一个java命令行,该命令行具有两组SSL属性,它们的相关元素设置为相同的值。一组具有等名称,而另一组具有等名称。例如: 我们的安全团队不允许在命令行或环境变量中传递密码,但允许将它们放置在文件中,前提是该文件具有受限访问权限。我注意到在目录中有一个文件,可用于为所有属性提供默认值,包括。当我从java命令行中删除

  • 在我们的测试环境中,我们的solr搜索引擎遇到了许多问题。我们在4.6版上有一个solr云设置,单个分片,4个节点。我们看到CPU在领导节点上的平行线达到100%几个小时,然后服务器开始抛出OutOfMemory错误,“性能警告:重叠onDeckSearcher”开始出现在日志中,领导进入恢复模式,过滤器缓存和查询缓存预热时间达到60秒左右(通常不到2秒),领导节点关闭,我们在整个集群恢复并选举新

  • 数据量 线程数 连接数 测试时间 4000(集合)*10000(文档数) 4 22、59 40分钟 4000(集合)*10000(文档数) 8 26分钟 4000(集合)*10000(文档数) 16 (20、20、20、66、41)(118、70、43、18、1) 20分钟 2. 数据插入测试 数据量 线程数 测试时间 1(集合)*1000万(文档数) 10(进程数)*2(线程数) 10分钟 参考

  • 我配置了一个Solr 4.4.0内核,其中包含约630k文档,原始大小约为10 GB。为了查询和高亮显示,每个字段都会复制到文本字段中。当我在没有突出显示的情况下执行搜索时,结果会在大约100毫秒后返回,但当打开突出显示时,相同的查询需要10-11秒。我还注意到,对相同术语的后续查询持续大约10-11秒。 我对该字段的初始配置如下 发送的查询类似于以下内容 我所有的研究似乎都没有提供线索来解释为什

  • 我们正在使用数据轴进行索拉/卡桑德拉。目前,我们的搜索响应小于200毫秒,但每五分钟响应一次,大约10秒。调试后,我们将原因确定为TTL。ttl 线程每 5 分钟运行一次,这就是我们看到性能下降的时候。但是我们无法弄清楚TTL线程正在做什么来阻止读取?数据软件企业版:4.8 任何人有任何想法,请分享。谢谢。