2009-09-28 179 views
13

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

回答

6

在较新版本的CouchDB中,您可以使用名为keys的JSON文档POST视图,该文档允许进行多键查找。该结构将是这个样子:

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

这可以被发布到一个视图,您有其各自的键是发光的标签。

这个和其他查询选项被记录在here

+2

我不确定这是否是最好的方法。假设我有一个15个不同的标签列表,可以应用于任何不同的组合和顺序,那么我会有15^14个组合键。生成和索引所有这些查询本身就是一项艰巨的任务。 PS:数学不是我最强的领域。纠正我,如果我错了。 – 2009-09-28 18:16:53

+0

当然,他们可能会被排序,你没有那么多的组合。 – Luman75 2013-11-20 16:02:46

+1

这可以检索所有至少包含密钥列表中的一个标签的文档。但是如果你想查找所有标签都有的文档呢? – 2015-04-23 10:08:08

0

一种做法与上面Ryan Duffield所述的一样。虽然它解决了一些查询,但在一段时间内它将变得难以管理。另一种方式是使用全文搜索,目前CouchDB不支持全文搜索,但有一个使用Lucene的外部插件。更多在这里http://wiki.apache.org/couchdb/Full_text_search

-2

实际上,标记似乎是一个非常关系的问题,并且与CouchDB的设计不兼容。所以我决定在mysql上有一个小数据库标签,并将实际文档存储在CouchDB中。这让我得到两全其美。虽然这种技术存在与同步有关的问题,但是在标签上搜索对于sql来说是一种高效的操作,并且内容不必太担心复制或分片。谢谢你的答案。

+0

我不同意这种说法;在CouchDB中正确完成标记时,标记工作得很好。我会建议看看像沙发一样的灵感:http://github.com/jchris/sofa – 2010-04-09 15:15:09

+0

我不知道为什么这是downvoted。 ER和相关查询最好在关系数据库中解决。 – Till 2011-12-22 15:02:35

0

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

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

UPD 这是可能的,但有限制,只2-3标签

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

查询由多个键

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

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

最后的选择是使用单独的索引,如couchdb-lucene来帮助查询。

1

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

指数由每一个标签,并表现良好的文件有文件ID:

 
[<some tag>, <document id>] 

例如,对于文档文件

  • docid1与标签[蓝,绿色,红色]
  • docid2与标签[蓝色,黄色]

你得到

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

现在你要搜索你打开一个并行搜索开始[标签,...]每个标签。

对于每个标签,您维护当前的搜索位置。如果所有搜索条件匹配,您找到了匹配项。如果它们不匹配,请尝试通过范围搜索跳过至少最高的文档ID。重复。

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

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