Frage

Ich möchte CouchDB verwenden, um einige Daten für mich zu speichern und dann RESTful api verwenden ruft die Daten zu bekommen, die ich brauche. Meine Datenbank wird als „Test“ und meine Dokumente alle haben eine ähnliche Struktur und in etwa so aussehen (wo hello_world ist die Dokument-ID):

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

Was ich möchte in der Lage sein zu tun haben meine Benutzer eine Abfrage senden, wie: „Gib mir alle Dokumente, die die Worte‚Hallo Welt‘, zum Beispiel enthalten Ich habe mit Blick herum spielen aber. es sieht aus wie sie mir nur erlaubt, einen oder mehrere dieser Werte in den „Schlüssel“ Teil der map-Funktion zu bewegen, die mir die Möglichkeit, so etwas zu tun gibt.

  

http: // localhost: 5984 / test / _Design / search / _view search_view /? key = "Hallo"

Aber das erlaubt mir nicht, meine Benutzer ihre Abfrage zu lassen Zeichenfolge angeben. Zum Beispiel, was passiert, wenn sie für „Hallo Welt“ gesucht. Ich würde zwei Abfragen zu tun haben: eine für „Hallo“ und eine für „Welt“ dann würde ich habe eine Reihe von JavaScript zu schreiben, um die Ergebnisse zu kombinieren, Duplikate entfernen, etc (igitt!). 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 verwenden Sie den Parameter „Hallo Welt“ in den Ansichten Map / Reduce-Funktionen, alle Dokumente zu finden, die sowohl „Hallo“ und „Welt“ enthalten in der Variablen-Array. Ist diese Art der Sache sogar möglich, mit CouchDB? Gibt es eine andere Möglichkeit, dies in einer Ansicht zu erreichen, das ich nicht zu denken?

War es hilfreich?

Lösung

CouchDB Ansichten unterstützen keine facettierte Suche oder die Volltextsuche oder Ergebnis Kreuzung. Die couchdb-lucene Plugin kann Sie all diese Dinge zu tun.

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

Andere Tipps

Technisch ist dies möglich, wenn Sie für jedes Dokument jeden Satz der Powerset des Tags des Dokuments als Schlüssel abgeben. Der Schlüsselsatz Element bestellt werden müssen und Ihre Abfrage whould die bestellten Tags abfragen müssen, auch.

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 würde emittieren:

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

Obwohl dies möglich ist, würde ich dies eine ziemlich arkward Lösung in Betracht ziehen. Ich möchte nicht für eine größere Anzahl von Tags, um die Festplattennutzung der Ansicht vorzustellen. Ich erwarte, dass die Anzahl der emittierten Tasten wie 2 ^ n wachsen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top