Java 如何提高Solr性能?

Java 如何提高Solr性能?,java,mysql,performance,solr,lucene,Java,Mysql,Performance,Solr,Lucene,我们如何使用Solr: 我们正在存储7K文档,其中3k属性附加到solr中的一个文档。每个属性都在solr上建立索引,以启用对这些属性的搜索/排序。我们根据搜索/筛选条件从solr获取数据,一个文档附带400+属性。所以,当我们尝试在solr中搜索带有1个属性的文本时(通过设置fl=“projectId”),在solr控制台上显示结果几乎不需要1秒,这很好 但是,如果我们尝试为相同的搜索条件获取100+个属性(这将返回字符串~100*3*no of matched document(~50),其

我们如何使用Solr: 我们正在存储7K文档,其中3k属性附加到solr中的一个文档。每个属性都在solr上建立索引,以启用对这些属性的搜索/排序。我们根据搜索/筛选条件从solr获取数据,一个文档附带400+属性。所以,当我们尝试在solr中搜索带有1个属性的文本时(通过设置fl=“projectId”),在solr控制台上显示结果几乎不需要1秒,这很好

但是,如果我们尝试为相同的搜索条件获取100+个属性(这将返回字符串~100*3*no of matched document(~50),其中7K个文档具有4K属性),则需要约20秒。但我们需要使用匹配的文档获取400+属性,这需要花费很长的时间~90秒,之前它由于outOfMemoryError崩溃,我们通过增加RAM大小和JVM堆大小修复了outOfMemoryError

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

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

我们也尝试过很多事情,比如增加堆大小、RAM大小和CPU数量,但没有成功。数据每天都在增加,这导致了很多问题。 它适用于少量项目或少量属性,但每当我们尝试获取更多属性时,它会花费太多时间,有时会崩溃

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

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

您可以只获取每个文档的“id”,然后从MySQL(您的永久存储)获取这些文档,而不是为每个文档返回400个字段

因此,在这个例子中,如果每次搜索都要返回25个文档ID,那么在应用程序中可以从MySQL获得25个文档(可能是并行调用)


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

您可以尝试使用分面搜索-多个搜索,以减少每次连续搜索的候选数量

另一种方法是广泛使用过滤器


如果您可以将一些查询转换为过滤器(fq),这可能会提高性能。

好的,我将尝试将我的搜索/过滤器条件添加到fq中,我不确定是否使用方面搜索?是的,我也这么想,同样,从mysql获取数据需要花费大量的时间well@ManojPSolr可以快速找到符合您条件的数据。一旦您知道每个与您的条件匹配的id,MySql将立即响应,因为您唯一的条件是在索引列(即id)上。然后,由于所有经过优化的预制函数,从数据库获取数据的速度将更快。解析Solr响应将花费更多的时间,因为您将需要使用XML解析器或其他更慢的东西。@ManojP这里的问题是您从Solr返回的数据太多。应用过滤器/面不会有帮助。在您的问题中,您已经提到,如果保持&fl=projectd,所需时间不到1秒。如果您认为MySQL也需要花费大量时间,那么下一个最好的选择就是查看像Memcached这样的缓存数据库。当您将数据插入MySQL/solr时,也将相同的数据插入memcached。从solr获取ProjectID后,从memcached获取文档。感谢您的时间和信息,我们通过添加MongoDB来填充数据(从solr获取id后)解决了此问题。我们实际上讨论了每个文档中附加了多少数据?如果每个文档的大小为MB,则在检索文档列表时必须传输大量数据。每个文档包含~1MB您要返回多少文档?您是否评估过将文档的序列化版本保存在缓存中并返回该版本,而不是从Solr或MySQL获取实际数据?@MatsLindh目前我们正在从Solr返回实际的搜索结果。我们在3K中有2950个动态字段,通过批量提交SolrInputDocumentList,通过java代码进行索引,没有定义任何类别。所有文档都在同一级别上。我正在考虑将组织id添加为类别,并将相关文档置于该类别下。这是否有助于提高我的搜索性能?