3 Stimmen

Beschränken Sie die couchdb-lucene Ergebnisse nach Schlüssel / spezifischem Feld? Karte?

Ich habe eine ziemlich einfache Frage.

Ich verwende CouchDB-Lucene, um den Volltext meiner Dokumente zu durchsuchen.

Jedes meiner Dokumente hat die folgenden Felder:

_id

_rev

docID (die eindeutige ID des Dokuments aus unserem System)

title (Titel des Dokuments)

content (Inhalt des Dokuments)

userID (der Benutzer, dem das Dokument gehört)

Mein Design-Dokument sieht so aus:

{
   "_id": "_design/lucene",
   "_rev": "10-770b7044393e067b7024a896ccf3c502",
   "fulltext": {
       "by_all": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.title); ret.add(doc.content); return ret }"
       },
       "by_title": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.title); return ret }"
       }
   }
}

Ich konnte nicht herausfinden, wie ich die docID als Teil der Ergebnisse zurückgeben kann, also habe ich die ID vorerst gleich der docID gemacht, aber ich würde gerne verstehen, wie ich die docID zurückgeben kann, da das obige Design-Dokument nur die Score und ID des Dokuments zurückgibt. Ich möchte lieber nicht den ID auf den gleichen Wert wie docID setzen, nur um darauf zugreifen zu können.

Wenn ich eine Anfrage wie diese ausführe:

localhost:5984/foo/_fti/_design/lucene/by_all?q=example~0.5f

Bekomme ich eine Sammlung aller Dokumente zurück, bei denen das Feld title oder content "example" enthält, und das ist großartig, aber wie kann ich nach "example" in den Feldern title und content NUR der Dokumente suchen, die eine bestimmte userID haben? Wie kann ich diesen Wert übergeben und verwenden?

Ich möchte so etwas tun:

localhost:5984/foo/_fti/_design/lucene/by_all?q=example~0.5f&userId=123

Wenn ich das mache: localhost:5984/foo/_fti/_design/lucene/by_all?q=example~0.5f, werden Dokumente für alle Benutzer zurückgegeben, was muss ich tun, um die Dokumente nur auf diejenigen zu beschränken, die einem bestimmten Benutzer gehören? Ich möchte nicht jedes Dokument aus Millionen durchsuchen, wenn nur ein paar tausend für einen bestimmten Benutzer relevant sind.

Vielen Dank!

p.s. Ich weiß, dass ich eine Map in den Views verwenden kann: "map": "function(doc){ emit(doc._id, doc._rev)}"

Ist das relevant? Gibt es einen Weg, die Map innerhalb der Ergebnisse von CouchDB-Lucene zu verwenden? Ich konnte nicht herausfinden, wie ich festlegen kann, welchen Wert ich als Schlüssel für die Map verwenden möchte, sodass standardmäßig die ID zurückgegeben wurde. Wie kann der Schlüssel so festgelegt werden, dass ein bestimmtes Feld verwendet wird? Vielleicht ist die Map nicht der richtige Ansatz... Ich weiß nicht, was ich hier tun soll, ich bin sehr neu sowohl in CouchDB als auch in Lucene und verstehe das alles noch nicht wirklich.

Nochmals vielen Dank!

3voto

Robert Newson Punkte 4571

Dies scheint einfach zu sein, aber Sie müssen Ihre Indexfunktion ändern.

function(doc) {
  var ret=new Document();
  ret.add(doc.title);
  ret.add(doc.content});
  ret.add(doc.userID, {"field":"userID"});
  ret.add(doc.docID, {"field":"docID","store":"yes"});
  return ret;
}

Abfrage mit;

localhost:5984/foo/_fti/_design/lucene/by_all?q=example%20AND%20userID:123

Dies findet alle Dokumente mit 'Beispiel' im Titel oder im Inhalt, solange userID gleich 123 ist. Darüber hinaus wird der docID-Wert in den Ergebnissen zurückgegeben.

MfG, B.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X