36

在我正在工作的一个项目中,客户有一个旧的和海量(TB 级)的 RDBMS。各种查询都很慢,没有时间修复/重构模式。我已经确定了需要优化的常见查询集。该集合分为两部分:全文查询和元数据查询。

我的计划是从他们的数据库中提取数据并将其分区到两个不同的存储系统中,每个存储系统都针对特定的查询集进行了优化。

对于全文搜索,Solr 是最有意义的引擎。它的分片和复制功能使其非常适合解决一半的问题。

对于元数据查询,我不确定采取什么路线。目前,我正在考虑使用具有极度非规范化模式的 RDBMS,该模式表示来自“权威”RDBMS 的特定数据子集。但是,我的客户担心与已经包含它们的 Solr 相比,此类子系统缺乏分片和复制,以及设置此类功能的困难/复杂性。在这种情况下,元数据采用整数、日期、布尔值、位和字符串的形式(最大大小为 10 个字符)。

是否有具有内置分片和复制功能的数据库存储系统可能对查询所述元数据特别有用?也许有一个提供良好查询引擎的无 sql 解决方案?

请照亮。

补充/回应:

Solr 可用于元数据,但是元数据是易失的。因此,我必须经常提交索引。这将导致搜索性能下降得非常快。

4

4 回答 4

23

乌鸦数据库

缺点:它是 AGPL 许可的。根据您的开发/服务器环境,您可以认为它在 .NET 上运行是一个骗局。此外,我不知道 .NET 以外的其他平台的客户端状态。

索兰德拉

  • 集成 Solr 和 Cassandra
  • Solr 管理的全文搜索
  • 由 Cassandra 管理的复制和分片

缺点:尚未发布。

弹性搜索:

ElasticSearch 看起来与 RavenDB 相似,但它似乎强调全文搜索,而 RavenDB 强调的是通用 NoSQL 数据库。

于 2011-05-13T14:05:25.803 回答
4

MongoDB用于元数据存储:

但是,缺点是您不能执行连接。对数据进行非规范化时要聪明,这样你就可以避免这种情况。

于 2011-05-23T18:30:35.387 回答
2

我确信您知道在任何频繁更新的系统上您都不会获得快速的查询时间。要针对 RDBMS 实现自己的分片,您需要找到一些键来拆分记录并填充多个数据库。然后你可以同时查询它们,以 map reduce 方式获取和处理数据。这将允许您随着数据的增长而增加机器的数量,并且可能允许您提高操作的速度。从快速的谷歌搜索来看,MongoDB 和 Hadoop 都提供了这种 map/reduce 功能,我对两者都不熟悉。

动态生成复杂的长时间运行的报告并不少见。然而,当报告完成生成时,这通常伴随着电子邮件通知。它为与人类交互提供了一种良好的推送通知格式。此外,如果这些报告是周期性的(例如每周、每月等),您仍然可以在这些报告准备就绪时使用电子邮件通知,唯一的区别是生成的启动时间是自动化的。

于 2011-05-20T14:23:46.703 回答
2

如果您使用elasticsearch,您可以简单地将元数据添加为 json 文档的额外键:

{
    "message": ... your full text,
    "date": "2009-11-15T14:12:12",
    ...
}

然后,您可以同时使用两者进行搜索。否则,如果您仍想使用两种系统方法,mongoDB是一个具有自动分片的文档存储,具有一些非常先进的查询机制(字段、map-reduce、快速查询的索引)。

于 2011-05-23T16:07:16.700 回答