2010-09-15 11 views
5

Chcę wykonać warunek LIKE (składnia SQL) w CouchDB. Jak to zrobić? Warunek LIKE zostanie użyty do wykonania automatycznego uzupełniania w przeglądarce.Stan podobny do CouchDB

Chcę napisać "co" w polu wejściowym i uzyskać wyniki Coffee, Couch, CouchDB ect.

Odpowiedz

9

Wyszukiwanie liter na początku ciągu jest bardzo łatwe. Potrzebujesz tylko widoku, który emituje ciąg, który chcesz wyszukać jako klucz. Zakładając, że dane wejściowe użytkownika są przechowywane w zmiennej q, wywołujesz ten widok z parametrami startkey=q i endkey=q+"\ufff0".

Chodzi o to, aby do łańcucha wyszukiwania dołączyć najwyższy możliwy kod Unicode. W kolejności sortowania ten ciąg pochodzi po czymkolwiek innym zaczynającym się od q. (To jest znacznie łatwiejsze do wdrożenia niż rozwiązanie sugerowane przez @titanoboa, gdzie musisz "zwiększyć" ostatnią literę danych wprowadzanych przez użytkownika).

Jeśli chcesz również znaleźć słowa w środku string (np „The Colbert Report” podczas wpisywania „CO”), można użyć widoku tak:

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); 
    } 
    } 
} 

oczywiście jest wskazane jedynie dla krótkich łańcuchach. W przypadku wyszukiwania dłuższych tekstów należy zajrzeć do dodatku do wyszukiwania pełnotekstowego, takiego jak couchdb-lucene.

+0

Dlaczego najwyższy możliwy jest kod Unicode 'fff0', a nie' ffff'? – Jez

+0

@Jez To dobre pytanie, nie mam pojęcia, dlaczego pisałem wtedy '\ ufff0'. Przypuszczam, że poprawny punkt kodowy miałby wartość '\ u {10FFFF}', ale nie testowałem tego. (https://en.wikipedia.org/wiki/UTF-8#Description) –

0

To nie zadziała z samym CouchDB. Najlepiej wypróbować wyszukiwarkę Lucene, która działa dobrze z CouchDB. Lucene jest przeznaczony do wyszukiwania pełnotekstowego, który w zasadzie jest tym, czego szukasz. Here to niektóre instrukcje dotyczące kombinacji.

0

Aby zaimplementować twój przykład, możesz utworzyć widok, który ma twoje pole jako klucz i to samo pole, cały dokument lub cokolwiek chcesz jako wartość. Jeśli zapytasz widok o parametrach startkey="co", endkey="cp", inclusive_end=false, otrzymasz wszystkie wpisy z kluczem rozpoczynającym się od "co".

Oczywiście jest to mniej skuteczne niż "LIKE".