Volltextsuche innerhalb des eingebetteten Dokuments

8

hier ist mein Dokument modal

%Vor%

Jetzt muss ich einen Textindex für das obige Dokument hinzufügen. Wie kann ich erreichen? Ich habe bereits einen Textindex für die Übersetzung hinzugefügt, aber das funktioniert nicht, da Name und Beschreibung innerhalb des Sprachpräfixes (innerhalb des Objekts) liegen. Außerdem muss ich Textgewicht (Text Score) für Name und Beschreibung separat angeben. d. h. Name hat den Text Score von 5 und Beschreibung haben 2 Punkte. also kann ich keinen Wildcard-Textindex angeben, d. h.

%Vor%

Ich habe es auch mit 'translation.en.name': 'text' versucht, aber das funktioniert nicht und auch meine Sprachen sind dynamisch, was die beste Lösung für diesen Fall erhöht.

Jede Hilfe wird sehr geschätzt.

    
Abdul Hameed 16.07.2016, 07:46
quelle

2 Antworten

4

Da die eingebetteten Felder dynamisch sind, besteht der beste Ansatz darin, das Schema so zu ändern, dass das Feld translation zu einem Array eingebetteter Dokumente wird. Ein Beispiel für ein solches Schema, das die aktuelle Struktur abbildet, folgt:

%Vor%

Mit diesem Schema ist es einfach, den Textindex auf die Felder name und description anzuwenden:

%Vor%

Um das Schema zu ändern, müssten Sie eine API verwenden, mit der Sie Ihre Sammlung in großen Mengen aktualisieren können und die Bulk API macht das für Sie. Diese bieten eine bessere Leistung, da Sie die Vorgänge in Stapeln von etwa 1000 an den Server senden. Dadurch erhalten Sie eine bessere Leistung, da Sie nicht jede Anfrage an den Server senden, sondern nur einmal alle 1000 Anfragen.

Im Folgenden wird dieser Ansatz veranschaulicht. Das erste Beispiel verwendet die in den MongoDB-Versionen verfügbare Massen-API & gt; = 2.6 und & lt; 3.2. Es aktualisiert alle Dokumente in der Sammlung, indem alle Übersetzungsfelder in Arrays geändert werden:

%Vor%

Das nächste Beispiel gilt für die neue MongoDB Version 3.2, die seit lehnte die Bulk-API ab und stellte einen neueren Apis-Satz mit bulkWrite() .

Es verwendet die gleichen Cursor wie oben, erstellt aber die Arrays mit den Massenoperationen, indem dieselbe forEach() cursor-Methode verwendet wird, um jedes Massenschreibdokument in das Array zu schieben. Da Schreibbefehle nicht mehr als 1000 Operationen akzeptieren können, müssen Sie Ihre Operationen so gruppieren, dass sie maximal 1000 Operationen haben, und das Array neu initialisieren, wenn die Schleife die 1000-Iteration erreicht:

%Vor%     
chridam 16.07.2016, 10:04
quelle
1

Um einen Index für das Namensfeld zu erstellen, verwenden Sie dieses db.collectionname.createIndex({"name": 'text'})

Um sicherzustellen, dass der Index erstellt wird, listen Sie alle mit diesem Befehl erstellten Indizes auf

db.collectionname.getIndexes()

BEARBEITEN

  

Das Problem, das nicht über die Indexerstellungsmethode, Problem ist, ist, wie man mit dem obigen Modell für alle Sprachen erreicht

Ich habe es jetzt, Sie können nicht indizieren, wie Sie wollen für alle Sprachen mit dem bestehenden Dokumentschema, bitte ändern Sie das Schema, unten ist eine Möglichkeit, wie Sie es erreichen können

%Vor%

Dann erstellen Sie den Index als db.collectionname.createIndex({"language" : "text"});

  

Die obige Annahme basiert auf dem von Ihnen vorgeschlagenen Modell, weil Name und Beschreibung Schlüssel innerhalb der Übersetzung sind, nicht Objekte auf oberster Ebene. nicht wahr?

Nein, mit dem von mir bereitgestellten Schema ist es einfacher, Textindizes für die Felder Name und Beschreibung zu haben, und Sie können basierend auf Sprachen suchen.

    
Clement Amarnath 16.07.2016 08:27
quelle