如何提高Solr性能?

4

我们如何使用Solr: 我们在Solr中存储了7K个文档,每个文档附带3k个属性。每个属性都被索引以便在Solr上进行搜索/排序。我们根据搜索/筛选条件从Solr中获取数据,每个文档附带400多个属性。因此,当我们尝试在Solr中搜索一些文本并设置一个属性(通过设置fl="projectId")时,它只需要1秒钟就可以在Solr控制台上显示结果,这很好。

然而,如果我们尝试为相同的搜索条件获取100多个属性(这将返回约100*3*匹配文档(约50)中的字符串,总共有4K个属性),则需要大约20秒。但是我们需要获取与匹配文档相关的400多个属性,这需要很长时间,大约90秒,之前由于OutOfMemoryError而崩溃,我们已经通过增加RAM大小和JVM堆大小来解决了这个问题。

Mysql数据与Solr同步: 目前,我们使用MySql DB作为主数据库,Solr服务器作为辅助数据库。我们通常会每天将mysql数据与Solr服务器同步。我们还会在更新Mysql DB上的任何属性时更新Solr服务器。

在应用程序中使用solr结果数据: 应用程序仪表板将包含用户预配置的列(属性)文档。用户可以应用搜索/筛选条件来填充所需结果,并在其仪表板上查看数据。因此,我们的应用程序会通过访问Solr服务器来根据搜索/筛选条件获取数据。

我们尝试了很多方法,如增加堆大小、RAM大小和CPU数量,但没有成功。数据每天都在增长,这导致了很多问题。对于小项目或少量属性,它可以正常工作,但是一旦尝试获取更多属性,它就需要太长时间,有时会崩溃。

我不确定我们是否正确使用索引?

有谁能提出更好/替代的方法吗? 提前致谢。


我们实际上需要处理多少数据才能与每个文档相关联?如果每个文档的大小为MB,则在检索文档列表时必须传输大量数据。 - MatsLindh
each document contains ~1MB - ManojP
你要返回多少个文档?你考虑过在缓存中保留序列化版本的文档并返回它,而不是从Solr或MySQL获取实际数据吗? - MatsLindh
@MatsLindh 目前我们从solr返回实际的搜索结果。我们有2950个动态字段,其中有3K个通过Java代码进行索引,通过提交SolrInputDocumentList批处理,没有定义任何类别,所有文档都在同一级别上。我正在考虑添加组织ID作为类别,并将相关文档放在该类别下。这样做是否有助于提高我的搜索性能? - ManojP
2个回答

5

与其每个文档返回400个字段,不如仅返回每个文档的“id”,然后从MySQL(您的永久存储)获取这些文档。

例如,如果每次搜索返回25个文档ID,在应用程序中,您可以从MySQL获取这25个文档(可能要进行并行调用)。

根据我的经验,返回更多的字段会大大增加qTime。


是的,我也在考虑同样的事情,但再次从MySQL获取数据将需要相当长的时间。 - ManojP
@ManojP Solr很快就能找到符合您条件的数据。一旦您知道每个符合条件的ID,由于您的唯一条件是在索引列上(即ID),MySql将立即回答。然后,通过所有经过优化的预制函数从数据库获取数据将更快。解析Solr响应需要更多时间,因为您需要使用XML解析器或其他工具,这会更慢。 - Random
@ManojP 这里的问题是你从solr返回了太多数据。应用过滤器/分面也无济于事。在你的问题中,你提到如果保留&fl=projectid,它只需要不到1秒的时间。如果你认为MySQL也需要很长时间,那么你下一个最好的选择是看看像Memcached这样的缓存数据库。当你将数据插入MySQL/solr时,也将相同的数据插入到memcached中。从solr获取项目ID后,从memcached获取文档。 - jay
感谢您的时间和信息。我们通过添加MongoDB来填充数据(在从Solr获取ID之后)已经解决了这个问题。 - ManojP

1
你可以尝试使用多维检索(facet search)——在每次搜索中减少候选项的多个搜索。
另一种方法是广泛使用过滤器。
如果你能将一些查询转化为过滤器(fq),那么这可能会在很大程度上提高性能。

好的,我会尝试将我的搜索/筛选条件添加到fq中,但我不确定facet搜索? - ManojP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接