CouchDB多标签

CouchDB多标签,couchdb,Couchdb,有没有办法在CouchDB中实现多标记搜索?我的文档(帖子)每个都有多个标签。我需要找到贴有任意一组标签的帖子。我该怎么做?当然,我可以通过多次调用一个视图来实现这一点,该视图为我提供标记文档,然后在我的应用程序中对其进行排序,但我想知道是否有一种方法可以在CouchDB视图中实现这一点。在CouchDB的最新版本中,您可以使用名为keys的JSON文档发布到视图中,它允许多键查找。该结构看起来像这样: {"keys": ["first_tag", "second_tag", "third_ta

有没有办法在CouchDB中实现多标记搜索?我的文档(帖子)每个都有多个标签。我需要找到贴有任意一组标签的帖子。我该怎么做?当然,我可以通过多次调用一个视图来实现这一点,该视图为我提供标记文档,然后在我的应用程序中对其进行排序,但我想知道是否有一种方法可以在CouchDB视图中实现这一点。

在CouchDB的最新版本中,您可以使用名为
keys
的JSON文档发布到视图中,它允许多键查找。该结构看起来像这样:

{"keys": ["first_tag", "second_tag", "third_tag"]}
这可以发布到您拥有的视图中,该视图正在为其各自的键发送标记


此查询选项和其他查询选项都有文档记录。

一种方法如Ryan Duffield所述。虽然它解决了一些查询,但随着时间的推移,它将变得不可管理。另一种方法是使用全文搜索,目前CouchDB不支持全文搜索,但有一个使用Lucene的外部插件。更多信息。

实际上,标记似乎是一个非常相关的问题,不能很好地配合CouchDB的设计。因此,我决定在mysql上建立一个用于标记的小型数据库,并将实际文档存储在CouchDB中。这让我两全其美。尽管这种技术存在与同步相关的问题,但在sql上搜索标记是一种有效的操作,而且内容不必太担心复制或分片。谢谢你的回答。

所以,据我所知,答案是否定的。 CouchDB无法查询存在多个标记的文档(lucene或mysql的解决方案不起作用,这样我们就失去了CouchDB的一些功能)。不幸的消息:(

(具有多个标签-同时具有A和B,而不是A或B)

UPD! 这是可能的,但仅限于2-3个标签

多键查询

某些应用程序需要查看具有多个键的实体的交集。在上面的示例中,这将是对“朋友”和“同事”中联系人的查询组。处理这种情况最直接的方法是查询其中一个键,然后在客户端按其余键进行过滤。如果键的频率变化很大,也值得进行初始调用以确定频率最低的键,并使用该键从我在数据库里

如果这不是一个好的选择,那么可以对键的组合进行索引,尽管给定文档的索引增长将与键的数量成指数关系。但是,对于较小的ish键集,这是一个选项,因为键可以排序,而作为较大键前缀的键可以省略。例如,对于e键集[1 2 3]可能的键组合是[1][2][3][1 2][1 3][2 3],但是,索引只需要包含键[3][1 3][2 3][1 2 3],因为(例如)可以通过查询startkey=[1,2,null]和endkey=[1,2,{}]来获得与键[1 2]匹配的文档。索引项的数量将为2^(n-1)钥匙的数量

最后一个选项是使用单独的索引,如couchdb-lucene来帮助进行此类查询


我认为下面应该给你一个稍微复杂但可靠的算法——即,即使你有很多文档,它也会很快找到第一个结果。它在实践中可能不会表现得很好:(

按每个标签和文档id为文档编制索引:

[<some tag>, <document id>] [, ] 例如,对于文件

  • 带标签的docid1[蓝色、绿色、红色]
  • 带标签的docid2[蓝色,黄色]
你得到

['blue', 'docid1'] ['blue', 'docid2'] ['green', 'docid1'] ['red', 'docid1'] ['yellow', 'docid2'] ['blue','docid1'] ['blue','docid2'] ['绿色','文档1'] ['red','docid1'] ['黄色','文档2'] 现在,对于要搜索的每个标记,打开一个从[tag,…]开始的并行搜索

对于每个标记,您保持当前搜索位置。如果所有搜索中的文档id匹配,则您找到了匹配项。如果不匹配,请尝试通过范围搜索跳到至少最高的文档id。重复

[基本上是一个连接。]


从理论上讲,跳过速度很快:我们有一个索引来查找这些文档。实际上,它可能很慢,因为需要往返服务器。如果能够将该算法卸载到服务器上执行的函数中,那将很好。这可能吗?

我解决了这个问题,创建了一个带有递归函数的视图。
这里的要点

我不确定这是否是最好的方法。假设我有一个包含15个不同标签的列表,这些标签可能以任何不同的组合和顺序应用,那么我将有15^14个组合键。生成和索引所有这些查询本身将是一项艰巨的任务。另外,数学不是我最擅长的领域。如果我错了,请纠正我。当然当然,它们可能会被排序,并且您没有那么多的组合。这样可以检索所有文档,其中至少有一个键列表中的标记。但是,如果您想查找所有文档中都有所有标记,该怎么办?我不同意这一断言;如果在CouchDB中正确完成标记,则标记工作得非常好。我建议您选择看看类似于Sofa的东西,我不知道为什么会被否决。ER和相关查询最好在关系数据库中解决。