2011-11-17 63 views
0

我必须抓取200万个URL并收获他们的元关键字。 然后,我需要存储每个唯一关键字并通过数据库,跟踪哪些关键字与/与其他关键字相关联。需要关于映射关键字关系的数据库技术和方法建议

我正在努力使用什么样的数据库 - 标准的RDBM似乎对这项任务非常敏感 - 我的直觉告诉我,MongoDB解决方案可能是最佳选择......但我对此很陌生。

对所有有经验的建议都开放。

回答

2

这几乎是Cassandra的理想用例。

通过哪些关键字在其中出现的索引URL与Cassandra最初为Facebook设计的收件箱搜索非常相似。使用行键为关键字且每列均为URL的宽行格式对于将关键字映射到URL时非常有效。要获取URL到关键字的反向映射,请将URL用作行键和每个关键字一列。

要跟踪关键字之间的一阶关系,您可以对每个关键字使用一行,并且该行中的每一列可以是在同一个URL中找到的另一个关键字。如果要存储更多信息(例如两个关键字一起出现的次数),请为每个列值使用Cassandra's built-in distributed counters之一。它们旨在处理大量的增量,并能够拥有数百万个活动的不同计数器。

听起来这个数据集可能会变得非常大。如果是这样,你应该认真考虑使用Cassandra来代替MongoDB。 Mongo根本不处理大于内存的数据集(由于它依赖于mmap),而Cassandra的设计着重于高效地写入和读取大于内存的数据集。

+0

对于MongoDB,您需要担心INDEX SIZE而不是DATASET SIZE。它处理比可用RAM大得多的数据集。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescancaninRAM –

+1

当然,如果你的索引不适合内存,你肯定死在水中(和对于这个特定的用例,索引本身将会非常大)。但是,拥有大于内存的活动数据集将快速让您受到I/O约束,无论您是在讨论写入还是读取;将会有很多页面交换。 –

1

这可以在MongoDB中运行良好。您可以为每个网址创建一个文档。在文档中有一个列出所用关键字的数组对象。该数组的索引,以便您可以快速找到任何提及任何特定关键字的URL。

使用的map-reduce总结:使用地图发射所使用的关键字(按字母顺序进行排序)为每个URL的每2克(或正克),然后减少计数的独特组合。将结果转储到一个新的集合中并按频率排序。