2009-09-28 180 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。重複。

[這基本上是一個加入。]

跳繩在理論上是快:我們有一個索引來查找這些文件。實際上,由於所有到服務器的往返旅程可能會很慢。能夠將該算法卸載到在服務器上執行的功能將是很好的。那可能嗎?