2011-12-27 65 views
3

我有一个存储项目(例如web文档)的应用程序。每个项目可以包含任意大量的标签。典型的常见查询是使用给定的标签集检索所有文档。那么,一个很常见的Web应用程序。NoSQL:索引和基于关键字的搜索

现在我正在考虑将NoSQL数据库作为持久存储。各种NoSQL系统(例如MongoDB)支持辅助索引和基于关键字的搜索。显示如何在不同系统中执行操作的示例很容易找到。问题是,我想知道“底层”中发生了什么,即二级索引如何/在哪里存储,以及如何实际执行带有一列标记的查询。特别是在有许多节点的系统中。

我知道基于Map/Reduce或类似的解决方案。但在这里我很感兴趣的索引工作。例如,我有的问题是:

  • 辅助索引是否仅存储项目/对象ID或更多?
  • 如果一个查询包含k个标签,是否有k个子查询 - 每个标签一个 - 执行并且k个部分结果合并成一个起始节点?

哪里可以找到不同NoSQL系统的这种信息?非常感谢任何提示。

基督教

回答

2

在MongoDB中对标签的索引将通过利用多键特征,由此数据库尝试匹配的文件对一个阵列的每个元素来完成。您可以对给定文档的这个标签属性进行索引,该属性将创建一个构建超出该数组中标签范围的btree。

您可以了解更多关于multikeys here,可以通过观看这个演示获取有关MongoDB的索引的更多信息:MongoDB Internals

是否二级索引只存储项目/对象ID或以上?

索引由索引字段组成(可以说它是一个标签数组,在你的情况下,那么这个字段将是一个标签)和一个偏移量,用于在内存中有效地定位文档。它也有一些填充+其他开销如上所述here

如果一个查询包含k个标签,k个子查询 - 每个标签一个 - 执行并且k个部分结果组合起来一个发起节点?

这取决于,但是,如果,例如,查询使用$或标记字段我认为查询是并行执行的,每个在O(log n)时间,结果合并形成结果集,但我不确定这一点,但。

+1

嗨泰勒,感谢您的回复和链接。演示文稿确实很有趣,也许有点太内部:)。我现在发现的是(至少)MongoDB为索引应用了基于文档的分区,即每个节点/分片/?维持它自己的本地索引。多条查询然后被发送到所有(?)节点并在本地处理。 (在我的第二个问题中描述的替代方法更适用于全局索引,即索引的基于术语的分区)。基督教再次感谢您的帮助 – Christian 2011-12-29 08:58:27