2009-07-29 15 views
17

Ich möchte mit CouchDB einige Daten für mich speichern und dann RESTful API-Aufrufe verwenden, um die Daten zu bekommen, die ich brauche. Meine Datenbank ist „test“ genannt und meine Dokumente alle haben eine ähnliche Struktur und in etwa so aussehen (wo hello_world die Dokument-ID ist):Wie führe ich eine parametrisierte Abfrage auf CouchDB durch?

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

Was Ich mag würde der Lage sein, meine Nutzer zu tun ist, haben sende eine Abfrage wie: "Gib mir zum Beispiel alle Dokumente, die die Wörter 'Hallo Welt' enthalten. Ich habe mit Ansichten herumgespielt, aber es sieht so aus, als ob sie nur erlauben würden, einen oder mehrere dieser Werte zu verschieben . der „Schlüssel“ Teil der map-Funktion das gibt mir die Möglichkeit, so etwas zu tun:

http://localhost:5984/test/_design/search/_view/search_view?key= „Hallo“

Aber das erlaubt mir nicht, meine Benutzer ihre Abfragezeichenfolge angeben zu lassen. Zum Beispiel, wenn sie nach "Hallo Welt" suchen. Ich müsste zwei Abfragen durchführen: eine für "Hallo" und eine für "Welt", dann müsste ich eine Menge Javascript schreiben, um die Ergebnisse zu kombinieren, Duplikate zu entfernen usw. (YUCK!). Was ich wirklich will, ist in der Lage sein, so etwas zu tun:

http://localhost:5984/test/_design/search/_view/search_view?term= „Hallo Welt“

Dann den Parameter „Hallo Welt“ in den Ansichten Map/Reduce-Funktionen alle zu finden, die Dokumente, die sowohl "Hallo" als auch "Welt" im Tag-Array enthalten. Ist das mit CouchDB überhaupt möglich? Gibt es einen anderen Weg, dies in einer Ansicht zu erreichen, an die ich nicht denke?

Antwort

19

CouchDB Views unterstützt keine Facettensuche oder Volltextsuche oder Ergebnisschnitt. Mit dem Plugin couchdb-lucene können Sie all diese Dinge tun.

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

+0

Möchten Sie Beispiele ausarbeiten? –

+6

Er ist einer der Entwickler des Projekts - "Sie können es nicht tun, aber dieses Projekt wird Sie lassen." Das ist eine ziemlich gute Antwort. – dnolen

2

Technisch ist das möglich, wenn Sie für jedes Dokument jeden Satz der Powerset des Tags des Dokuments als Schlüssel abgeben. Das Schlüsselsatzelement muss bestellt werden und Ihre Abfrage muss auch die bestellten Tags abfragen.

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

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

für den doc {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} dies emittieren würde: Ich halte wäre dies eine eher arkward Lösung

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

Obwohl dies möglich ist. Ich möchte nicht die Verwendung der Ansicht der Ansicht für eine größere Anzahl von Tags vorstellen. Ich erwarte, dass die Anzahl der ausgegebenen Schlüssel wie 2^n anwächst.

+2

wird dies nicht empfohlen. Die Leistung wird stark leiden und wie Sie erwähnt haben, wird der Speicher für die Indizes außer Kontrolle geraten. couchdb-Lucene oben erwähnt ist der richtige Weg zu tun, was er will. –

Verwandte Themen