2010-09-15 11 views
5

Ich möchte eine LIKE-Bedingung (SQL-Syntax) in CouchDB durchführen. Wie kann das gemacht werden? Die LIKE-Bedingung wird verwendet, um die automatische Vervollständigung im Browser durchzuführen.Like-Bedingung in CouchDB

Ich möchte "co" in das Eingabefeld schreiben und die Ergebnisse Kaffee, Couch, CouchDB ect.

Antwort

9

Es ist sehr einfach nach Buchstaben am Anfang eines Strings zu suchen. Sie benötigen nur eine Ansicht, die die Zeichenfolge ausgibt, nach der Sie als Schlüssel suchen möchten. Wenn die Benutzereingabe in einer Variablen q gespeichert ist, rufen Sie diese Ansicht mit den Parametern startkey=q und endkey=q+"\ufff0" auf.

Der Trick besteht darin, das höchstmögliche Unicode-Zeichen an die Suchzeichenfolge anzuhängen. In der Sortierreihenfolge kommt diese Zeichenfolge nach allem, was mit beginnt. (Dies ist viel einfacher zu implementieren als die von @titanoboa vorgeschlagene Lösung, bei der Sie den letzten Buchstaben der Benutzereingabe "inkrementieren" müssen.)

Wenn Sie auch Wörter in der Mitte eines suchen möchten Zeichenfolge (zB „The Colbert Report“, wenn „co“ eingeben), können Sie eine Ansicht wie diese verwenden:

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

dies ist natürlich nur für kurze Strings ratsam. Um in längeren Texten zu suchen, sollten Sie in ein Volltext-Such-Add-on wie couchdb-lucene schauen.

+0

Warum ist das höchstmögliche Unicode-Zeichen 'fff0' und nicht' ffff'? – Jez

+0

@Jez Das ist eine gute Frage, ich habe keine Ahnung, warum ich damals '\ ufff0' geschrieben habe. Ich nehme an, dass der richtige Codepunkt '\ u {10FFFF}' ist, aber ich habe das nicht getestet. (https://en.wikipedia.org/wiki/UTF-8#Description) –

0

Das funktioniert nicht mit CouchDB allein. Am besten ist die Lucene-Suchmaschine, die gut mit CouchDB funktioniert. Lucene wurde für die Volltextsuche entwickelt, die genau das ist, wonach Sie suchen. Here sind einige Anweisungen für die Kombination.

0

Um Ihr Beispiel zu implementieren, könnten Sie eine Ansicht erstellen, die Ihr Feld als Schlüssel und das gleiche Feld, das gesamte Dokument oder was auch immer Sie wollen, als Wert hat. Wenn Sie die Ansicht mit den Parametern startkey="co", endkey="cp", inclusive_end=false abfragen, erhalten Sie alle Einträge mit einem Schlüssel, der mit "co" beginnt.

Natürlich ist dies weniger mächtig als "LIKE".