如何提高 Solr 性能?

How to improve Solr performance?

我们如何使用 Solr: 我们在 solr 中存储 7K 文档,其中一个文档附加了 3k 属性。每个属性都在 solr 上建立索引,以在这些属性上启用 search/sort。我们正在根据 search/filter 标准从 solr 获取数据,其中 400 多个属性附加到一个文档。因此,当我们尝试在 solr 中搜索具有 1 个属性(通过设置 fl="projectId")的一些文本时,几乎不需要 1 秒就可以在 solr 控制台上显示结果,这很好。

但是,如果我们尝试为相同的搜索条件获取 100+ 个属性(这将 return 字符串 ~100*3* 没有匹配的文档(~50)来自具有 4K 属性的 7K 文档)它需要~20 秒。但是我们需要用匹配的文档获取 400+ 属性,这需要很长时间~90 秒,早些时候它因内存溢出错误而崩溃,我们通过增加 RAM 大小和 JVM 堆大小修复了它。

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

在应用程序中使用 solr 结果数据: 应用程序仪表板将包含带有用户预配置列(属性)的文档。用户可以应用 search/filter 标准来在他的仪表板上填充所需的结果。所以我们的应用程序尝试通过访问它来从 solr 服务器获取符合 search/filter 条件的数据。

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

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

任何人都可以建议 better/alternate 方法吗? 提前致谢。

无需为每个文档取回 400 个字段,您可以只取回每个文档的 "id",然后从永久存储的 MySQL 中获取这些文档。

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

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

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

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

如果您可以将某些查询转换为过滤器 (fq),这可能会在一个很好的因素上提高性能。