【问题标题】:How to match a superset key to a subset using group_level (sub selects in couchdb?)如何使用 group_level 将超集键与子集匹配(couchdb 中的子选择?)
【发布时间】:2011-03-08 02:17:48
【问题描述】:

如何在 couchdb 中进行子选择,或者如何使用 group_level 将超集键匹配到子集

我有一个非常复杂的问题,希望对不只是第一次学习 map/reduce 和 couchdb 的人有一个不太复杂的答案。

我正在开发一个系统,该系统向客户端提供 json 清单,以使用每天更新的内容对其自身进行配置。在第一次运行时,客户端使用一些描述性标签(例如:屏幕大小、操作系统、位置)注册自己,然后服务器返回一个 group_id。客户端每天使用该 ID 来请求其清单。在后端,我们任意将共享某些标签的客户端分组在一起,以减少我们需要存储/服务的唯一清单的数量。

我们的销售/管理员有一个网络应用程序,他可以在其中设置受众群体以针对特定群体的特定内容。一个受众可以重叠多个组。诀窍是,当客户报告以获得新的清单时,我们需要确定哪些受众最适合该客户的群体。最匹配的受众将是标签是提交组标签子集的第一个受众,例如:

观众1:标签A,标签B,标签C,标签D 观众2:标签A,标签C 组1:标签A,标签B,标签C

该组应该匹配 Audience2,而不是 Audience1。

如果我们使用受众标签来查找最佳组匹配(换句话说,如果 group.tags 是 Audience.tags 的子集),我可以像这样构建一个非常有效的索引:

[tagA, tagB, tagC], group1._id [tagA, tagC, tagB], group1._id [tagB, tagA, tagC], group1._id [tagB, tagC, tagA], group1._id [tagC, tagA, tagB], group1._id [tagC, tagB, tagA], group1._id

并使用 group_level=2 和 key=[tagA, tagC] 将 Audience2 与索引中的第二行匹配。问题是,我无法弄清楚如何从另一个方向进行此操作:将 group.tags 与 Audience.tags 的索引进行匹配,其中我们在查询时知道的标签 (group.tags) 是我们尝试匹配的标签(audience.tags)

我已经牢牢掌握了简单的 m/r 视图,但我一直在这个问题上遇到死胡同。我提出的每个解决方案都涉及在我的视图函数中进行某种子选择,这在 couchdb 视图中不起作用......关于如何解决这样的问题的任何想法?

希望这个描述有点道理。

【问题讨论】:

    标签: view couchdb mapreduce


    【解决方案1】:

    我能想到的最简单的解决方案是:

    • 对每个观众的标签进行排序,并将排序后的数组作为视图的键发出。
    • query the view using multiple keys,即使用 {"keys": ["key1", "key2", ...]} 进行 POST。

    这些键是您正在寻找的所有可能的键,按重要性相反的顺序排列(行按指定键的顺序返回。)同样,键中的标签是排序的。

    在您的示例中,键可以是:

    [tagA, tagB, tagC]
    [tagB, tagC]
    [tagA, tagC]
    [tagA, tagB]
    [tagC]
    [tagB]
    [tagA]
    

    第一个结果就是你想要的,所以你可以使用limit=1。

    【讨论】:

    • 是的,我认为可以。我昨天发现了多键发布,并认为可能有机会揭示解决方案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2016-01-11
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多