2010-09-15 76 views
5

我想在CouchDB中執行LIKE條件(SQL語法)。如何才能做到這一點? LIKE條件將用於在瀏覽器中執行自動完成。CouchDB中的類似條件

我想在輸入字段中寫入「co」並獲得結果Coffee,Couch,CouchDB等。

回答

9

在字符串的開頭搜索字母非常容易。你只需要一個視圖來發出你想要搜索的字符串作爲鍵。假設用戶輸入存儲在變量q中,則可以使用參數startkey=qendkey=q+"\ufff0"調用該視圖。

這裏的技巧是將最高可能的Unicode字符附加到搜索字符串。在排序順序中,該字符串位於以q開頭的任何其他位置之後。 (這比@titanoboa建議的解決方案實現起來要容易得多,您需要「增加」用戶輸入的最後一個字母。)

如果您還希望能夠找到字符串(如「科爾伯特報告」中鍵入「合作」的時候),你可以使用這樣一個觀點:

function(doc) { 
    if (doc.title) { 
    var words = {}; 
    doc.title.replace(/\w+/g, function(word) { 
     words[word.toLowerCase()] = true; 
    }); 
    for (w in words) { 
     emit(w, doc); 
    } 
    } 
} 

當然這只是針對短字符串爲宜。要搜索更長的文本,您應該查看全文搜索附加組件,如couchdb-lucene

+0

爲什麼最高可能的Unicode字符「fff0」而不是「ffff」? – Jez 2016-09-20 13:37:14

+0

@Jez這是一個很好的問題,我不知道爲什麼我當時寫了'\ ufff0'。我認爲正確的代碼點將會是'\ uFFFF}',但我沒有測試過這個。 (https://en.wikipedia.org/wiki/UTF-8#Description) – 2017-02-20 09:26:36

0

這不適用於單獨的CouchDB。最好的嘗試是與CouchDB配合使用的Lucene搜索引擎。 Lucene是專爲全文搜索而設計的,基本上你在找什麼。 Here是關於組合的一些說明。

0

要實現您的示例,您可以創建一個視圖,將您的字段作爲鍵和相同的字段,整個文檔或任何您想要的值作爲值。如果使用參數startkey="co", endkey="cp", inclusive_end=false查詢視圖,您將獲得以「co」開頭的所有條目。

當然,這不如'LIKE'強大。