NoSQL:索引和基于关键字的搜索

Chr*_*ian 5 indexing couchdb full-text-indexing mongodb nosql

我有一个存储项目(例如 Web 文档)的应用程序。每个项目都可以具有任意大的标签集。典型的常见查询是检索具有给定标签集的所有文档。嗯,一个很常见的 Web 应用程序。

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

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

  • 二级索引是否只存储项目/对象 id 或更多?
  • 如果查询包含 k 个标签,是否会执行 k 个子查询(每个标签一个)并且将 k 个部分结果合并为发起节点之一?

我在哪里可以找到不同 NoSQL 系统的此类信息?非常感谢您的任何提示。

基督教

Tyl*_*ock 2

在 MongoDB 中,标签索引将通过利用多键功能来完成,数据库会尝试将文档与数组的每个元素进行匹配。您将索引给定文档的此标签属性,这将创建一个根据该数组中的标签范围构建的 btree。

您可以在此处了解有关多键的更多信息,并且可以通过观看此演示文稿来获取有关 MongoDB 中索引的更多信息:MongoDB 内部

二级索引是否仅存储项目/对象 ID 或更多?

索引由索引字段(假设它是您的情况下的标签数组,那么该字段将是单个标签)和用于在内存中有效定位文档的偏移量组成。它还具有一些填充和其他开销,如此处所述

如果查询包含 k 个标签,是否会执行 k 个子查询(每个标签一个)并将 k 个部分结果组合到起始节点?

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