如何搜索巨大的非文本数据集?

时间:2011-05-13 04:31:07

标签: c# search solr nosql ravendb

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

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

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

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

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

请点亮。

附加/回应:

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

4 个答案:

答案 0 :(得分:22)

<强> RavenDB

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

<强> Solandra

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

缺点:尚未发布。

<强> ElasticSearch:

ElasticSearch看起来与RavenDB类似,但它似乎emphasize full-text search,其中RavenDB强调成为一般的NoSQL数据库。

答案 1 :(得分:4)

MongoDB 用于元数据存储:

然而,缺点是您无法执行联接。明智地对数据进行非规范化,以便避免这种情况。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

如果使用elasticsearch,您只需将元数据添加为json文档的额外键:

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

然后你可以同时搜索这两个。否则,如果您仍然想要执行这两种系统方法,monogoDB是一个具有自动分片的文档存储,它具有一些非常高级的查询机制(字段,map-reduce,用于快速查询的索引)。