如何search巨大的非文本数据集?
在我工作的一个项目中,客户有一个旧的和巨大的(TB级)RDBMS。 所有types的查询都很慢,没有时间修复/重构模式。 我已经确定了需要优化的一组常用查询。 该组分为两部分:全文和元数据查询。
我的计划是从数据库中提取数据,并将其分区到两个不同的存储系统,每个存储系统都针对特定的查询集进行了优化。
对于全文search,Solr是最有意义的引擎。 这是分片和复制function,使它非常适合问题的一半。
对于元数据查询,我不知道要采取什么路线。 目前,我正在考虑使用一个非常规规范化模式的RDBMS,它表示来自“权威”RDBMS的特定数据子集。 然而,我的客户担心这种子系统缺乏分片和复制function,而与已经包含这些function的Solr相比,设置这些function的困难/复杂性更为困难。 在这种情况下,元数据采用整数,date,布尔,位和string(最大大小为10个)的forms。
是否有一个数据库存储系统具有内置的分片和复制function,可能对查询元数据特别有用? 也许一个没有SQL的解决scheme提供了一个好的查询引擎?
请照亮。
添加/回应:
Solr可以用于元数据,但是元数据是不稳定的。 所以,我不得不经常去索引。 这会导致search速度非常快。
使用MongoDB作为元数据存储:
- 内置分片
- 内置复制
- 故障转移和高可用性
- 简单的查询引擎 ,应该适用于最常见的情况
然而 ,缺点是你不能执行连接。 明智地对数据进行非规范化处理,以便避免这种情况。
RavenDB :
- 它有内置的Lucene全文search。
- 它可以被复制 。
- 它支持分片 。
- 它有一个HTTP API,所以你原则上可以在任何平台上使用它。
缺点:这是AGPL许可。 根据你的开发/服务器环境,你可以考虑它在.NET上运行。 此外,我不知道其他平台的客户端的状态。
Solandra :
- 整合Solr和Cassandra
- 由Solrpipe理的全文search
- 由Cassandrapipe理复制和分片
缺点:尚未发布。
ElasticSearch:
- 它有内置的Lucene全文search。
- 它可以被复制 。
- 它支持分片 。
- 它有一个HTTP API,所以你原则上可以在任何平台上使用它。
ElasticSearch与RavenDB类似,但似乎强调全文search ,RavenDB强调成为一个普通的NoSQL数据库。
我相信你知道你不会在频繁更新的系统上获得快速的查询时间。 要实现对RDBMS的分片,您需要find一些关键字来分割logging并填充多个数据库。 然后,您可以同时查询所有这些数据,以便以减less地图的方式获取和处理数据。 这将允许您随着数据增长而增加机器的数量,并可能允许您提高操作的速度。 从快速谷歌searchMongoDB和Hadoop都提供了这个map / reducefunction,我对这两个都不熟悉。
即时生成复杂的长时间运行报告并不罕见。 然而,这通常伴随着报告生成后的电子邮件通知。 它提供了一个很好的推送通知格式来与人交互。 另外,如果这些报告是以循环方式(例如每周,每月等)预期的,那么当这些报告准备就绪时,您仍然可以使用电子邮件通知,唯一的区别是生成的启动时间是自动的。
如果您使用elasticsearch ,则可以简单地将元数据添加为json文档的额外键:
{ "message": ... your full text, "date": "2009-11-15T14:12:12", ... }
然后你可以同时search。 否则,如果你仍然想做两种系统方法, monogoDB是一个具有自动分片function的文档存储,它具有一些相当先进的查询机制(字段,map-reduce,用于快速查询的索引)。