【发布时间】:2015-07-09 06:33:24
【问题描述】:
我们如何使用 Solr: 我们在 solr 中存储 7K 文档,其中 3k 属性附加到一个文档。每个属性都在 solr 上建立索引,以启用对这些属性的搜索/排序。我们根据搜索/过滤条件从 solr 获取数据,其中一个文档附加了 400 多个属性。因此,当我们尝试在 solr 中搜索具有 1 个属性的文本时(通过设置 fl="projectId"),在 solr 控制台上显示结果几乎不需要 1 秒,这很好。
但是,如果我们尝试为相同的搜索条件获取 100+ 个属性(这将返回字符串 ~100*3* no of match document(~50) out of 7K document with 4K attribute)大约需要 20 秒。但是我们需要用匹配的文档获取 400 多个属性,这需要很长时间 ~ 90 秒,早些时候它由于 outOfMemoryError 而崩溃,我们通过增加 RAM 大小和 JVM 堆大小来修复它。
Mysql 数据与 Solr 同步: 目前我们使用 MySql DB 作为主数据库,Solr Server 作为辅助数据库。我们过去每天都会将 mysql 数据与 Solr 服务器同步。每当我们更新 Mysql DB 上的任何属性时,我们也会更新 solr 服务器。
在应用程序中使用 solr 结果数据: 应用程序仪表板将包含用户预先配置的列(属性)的文档。用户可以应用搜索/过滤条件在他的仪表板上填充所需的结果。因此,我们的应用程序尝试通过访问 solr 服务器来获取具有搜索/过滤条件的数据。
我们已经尝试了很多方法,例如增加堆大小、RAM 大小和 CPU 的数量,但没有运气。数据每天都在增加,这导致了很多问题。 它适用于少量项目或少量属性,但每当我们尝试获取更多属性时,它会花费太多时间,有时它会崩溃。
我不确定我们是否正确使用了索引?
任何人都可以提出更好/替代的方法吗? 提前致谢。
【问题讨论】:
-
我们实际上谈论了多少数据附加到每个文档?如果每个文档的大小为 MB,则在检索文档列表时必须传输大量数据。
-
每个文档包含 ~1MB
-
您要返回多少文件?您是否评估过将文档的序列化版本保存在缓存中并返回,而不是从 Solr 或 MySQL 获取实际数据?
-
@MatsLindh 目前我们正在从 solr 返回实际的搜索结果。我们有 3K 的 2950 个动态字段,并通过 java 代码通过分批提交 SolrInputDocumentList 进行索引,没有定义类别,所有文档都在同一级别。我正在考虑将组织 ID 添加为类别并将相关文档放在该类别下。它有助于提高我的搜索性能吗?
标签: java mysql performance solr lucene