CouchDB多个标签

时间:2009-09-28 05:50:11

标签: couchdb

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

6 个答案:

答案 0 :(得分:6)

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

{"keys": ["first_tag", "second_tag", "third_tag"]}

这可以张贴到您为其各自的键发出标签的视图。

此记录和其他查询选项记录在案here

答案 1 :(得分:6)

我已经解决了这个问题,创建了一个带递归函数的视图。 这里有要点https://gist.github.com/820412

答案 2 :(得分:1)

我认为下面的内容应该会给你一个稍微复杂但实体的算法 - 即使你有很多文档,它确实可以快速找到第一个结果。它在实践中可能表现不佳:(

按每个标记索引文档,文档ID为

[<some tag>, <document id>]

E.g。对于文件文件

  • docid1,标签为[蓝色,绿色,红色]
  • docid2,标签为[blue,yellow]

你得到了

['blue', 'docid1']
['blue', 'docid2']
['green', 'docid1']
['red', 'docid1']
['yellow', 'docid2']

现在,对于您要搜索的每个标记,打开从[tag,...]开始的并行搜索。

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

[它基本上是一个加入。]

跳过理论上很快:我们有一个索引来查找这些文档。实际上,由于到服务器的所有往返行程,它可能很慢。能够将该算法卸载到服务器上执行的函数是很好的。这可能吗?

答案 3 :(得分:0)

一种做法如上文Ryan Duffield所述。虽然它解决了一些问题,但在一段时间内它将变得无法管理。其他方法是使用CouchDB目前不支持的全文搜索,但有一个使用Lucene的外部插件。更多http://wiki.apache.org/couchdb/Full_text_search

答案 4 :(得分:0)

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

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

<强> UPD! 这是可能的,但只有2-3个标签的限制。

http://wiki.apache.org/couchdb/EntityRelationship

  

通过多个键查询

     

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

     

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

     

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

答案 5 :(得分:-2)

实际上,标记似乎是一个非常关系的问题,并且与CouchDB的设计不相符。所以我决定在mysql上有一个用于标记的小数据库,并将实际文档存储在CouchDB中。这让我可以充分利用这两个世界。虽然这种技术存在与同步相关的问题,但是对标记进行搜索对sql是一种有效的操作,并且内容并不需要担心复制或分片。谢谢你的所有答案。