2009-07-29 49 views
17

參數化查詢我想用的CouchDB來存儲我一些數據,然後使用REST的API調用來得到我需要的數據。我的數據庫名爲「測試」和我的文檔都有着類似的結構,看起來像這樣(其中程序hello_world是文檔ID):如何執行對CouchDB的

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} 
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

我想什麼,能夠做的是有我的用戶發送一個查詢,例如:「給我所有包含'hello world'這些單詞的文檔,我一直在玩弄意見,但它看起來像只允許我將一個或多個這些值移動到。該地圖功能的「重點」部分也練就了我做這樣的事情的能力:

http://localhost:5984/test/_design/search/_view/search_view?key=「你好」

但是這不允許我讓我的用戶指定他們的查詢字符串。例如,如果他們搜索「hello world」,該怎麼辦?我必須做兩個查詢:一個用於「hello」和一個用於「world」,然後我必須編寫一堆javascript來結合結果,刪除重複項等(YUCK!)。我真正想要的是能夠做這樣的事情:

http://localhost:5984/test/_design/search/_view/search_view?term=的「Hello World」

然後在視圖地圖使用參數的「Hello World」 /縮小功能,找到所有的在tags數組中包含「hello」和「world」的文檔。用CouchDB甚至可以做到這種事情嗎?有沒有另一種方法可以在我沒有想到的觀點中實現這一點?

回答

19

CouchDB視圖不支持多面搜索或全文搜索或結果交集。 couchdb-lucene插件可以讓你做所有這些事情。

http://github.com/rnewson/couchdb-lucene/tree/master

+0

有意詳細說明或提供示例? – 2009-07-29 21:29:19

+6

他是該項目的開發人員之一 - 「你做不到,但這個項目會讓你。」這是一個很好的答案。 – dnolen 2009-07-30 15:17:54

2

從技術上講,如果你發出的每一個文件每套文檔作爲關鍵的變量的冪的,這是可能的。密鑰集元素必須訂購,您的查詢也必須查詢訂購的標籤。

function map(doc) { 
    function powerset(array) { ... } 

    powerset_of_tags = powerset(doc.tags) 
    for(i in powerset_of_tags) { 
    emit(powerset_of_tags[i], doc); 
    } 
} 

的文檔{"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}這將發出:

{ key: [], doc: ... } 
{ key: ['hello'], doc: ... } 
{ key: ['world'], doc: ... } 
{ key: ['hello', 'world'], doc: ... } 

雖然這是可能的我會認爲這是一個相當arkward解決方案。我不想把大量標籤視爲磁盤使用情況。我期望發射的密鑰數量增長爲2^n。