【问题标题】:Inverted Index possible from couchdb view?从 couchdb 视图可以实现倒排索引?
【发布时间】:2012-04-21 04:53:06
【问题描述】:

假设我的 couchdb 文档看起来像这样:

{
    "_id": "id",
    "_rev": "rev",
    "title": "foobar",
    "URI": "http://www.foobar.com",
    "notes": "",
    "date": 1334177254774,
    "tags": [
        "tag1",
        "tag2",
        "tag3"
    ],
    "date_modified": 1334177278457,
    "deleted": false
}

我想要的是从标签创建一个倒排索引,所以我最终得到了类似的东西:

{
    "tag1": [
        _id,
        _id,
        _id
    ],
    "tag2": [
        _id,
        _id,
        ...
    ]
}

根据我的阅读和尝试,couchdb 可能不会让我这样做。我无法在地图阶段完成它,而且我似乎无法在沙发缩减阶段完成它。 这是我需要在应用程序的另一层完成的事情吗?

【问题讨论】:

  • 你试过什么?似乎对于 map 阶段,您将对标签执行 for 循环,然后为每个标签执行 emit(tag, _id)。然后,在 reduce 中,您会将键值对与相同的键组合起来。我还没试过。
  • @MatthewFlaschen,你不能在reduce中组合键值对,因为无法预测结果的大小。归约函数,必须严格将输入归约为一个较小且最大尺寸固定的值。

标签: indexing couchdb inverted-index


【解决方案1】:

可以通过 CouchDB 的地图功能实现这一点。

CouchDB 喜欢 tall 列表,而不是 fat 列表。因此,要在这个问题上“切入正题”,您需要一个以标签为键的视图,每个文档 ID 有一行。

// View rows (conceptual diagram)
// Key  , Value
[ "tag1", "_id1"
, "tag1", "_id2"
, "tag1", "_id3"

, "tag2", "_id2"
, "tag2", "_id4"
, "tag3", "_id6"
]

要获取带有标签的所有文档 ID 的列表,请点击带有标签名称作为键的视图,GET /db/_design/ddoc/_view/tags?key="tag1"

这应该足够了。但是作为 lagniappe,您可以将 "reduce" 值设置为 "_count" 以获取使用的所有标签的计数(对于构建标签云很有用)。只要记住要查询索引时添加&reduce=false即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多