MongoDB + Node.js + AJAX-Lösung für die automatische Vervollständigungssuche

8

Ich möchte eine Typahead / Autocomplete-Suche zum Spaß implementieren. Ich habe ein paar Attribute in meinem Schema in mongoDB, aber ich möchte nur nach Kategorie, Titel, Vorschau oder Datum suchen können.

Dies ist mein MongoDB-Schema für einen einzelnen Artikel (ich benutze Mungo als ORM):

%Vor%

Jedes Mal, wenn ich etwas erstelle, aktualisiere oder zerstöre, muss ich neu indizieren, damit die Suche aktualisiert wird. Die Suche wird automatisch vervollständigt, so dass zum Beispiel, wenn ich zwei Artikel mit dem Titel "Welcome to stackoverflow" und "Wie stoveoverflow zu vermeiden" und der Benutzer gibt einen Schlüssel 't' dann würde ich beide Artikel mit AJAX seitdem anzeigen Beide haben in ihren Titeln das Zeichen 't' . Ich möchte auch jedes einzelne 't' hervorheben; 't' in 'to' , 't' in s 't' ackoverflow, um anzuzeigen, dass die Abfrage auf etwas trifft. (Ich erwarte, dass es ähnlich aussieht, wenn wir hier auf stackoverflow.com nach bestimmten 'Tags' suchen)

Die Frage lautet nun, ob ich ein anderes Schema für die Indexierung verwenden oder einfach mein bestehendes Schema beibehalten soll. Es scheint, dass ich nicht das "body" -Attribut verwenden werde, das den vollständigen Artikel enthält und tausende von Wörtern enthält, da ich momentan keine Volltextsuche durchführen möchte.

  • Titelattribute haben wahrscheinlich nur ~ 45 Zeichen und durchschnittlich 3 oder 4 Wörter.
  • Kategorie meist nur 1 Wort mit durchschnittlich 9-15 Zeichen.
  • Vorschau wäre die größte Datenmenge mit ~ 150 Zeichen und 20 Wörtern im Durchschnitt.

Ich würde das wahrscheinlich gerne mit Hilfe von Datenstrukturen implementieren. Oben auf meinem Kopf würde ich wahrscheinlich sagen, dass dies eine Möglichkeit ist, indem AJAX jeden Tastendruck anfordert, der an den Handler node.js weitergeleitet wird, und von dort aus eine Abfrage an mongoDB macht, die jeden Eintrag zurückgibt, der Wörter enthält hat einen Buchstaben, der dem Tastendruck entspricht, der vom Benutzer als JSON-Datei eingegeben wurde. Ich werde dann diese JSON-Datei analysieren und jeden Eintrag anzeigen.

Die Frage ist dann, wie würde ich den Trie-Algorithmus in meinen Plan einfügen? Die andere Sache ist, dass ich den Index jedes Mal neu erstellen muss, wenn ich CRUD-Operation mache.

Ich würde mich über Vorschläge / Hinweise auf die richtige Richtung oder Artikel, die mir dabei helfen könnten, freuen. (Ich versuche, die beste Praxis / performante Art und Weise zu tun) Danke. Lassen Sie mich wissen, ob die Frage geklärt werden muss.

    
Benny Tjia 28.01.2012, 00:51
quelle

1 Antwort

8

Ich glaube nicht, dass ein Trie funktioniert. Trie's funktionieren normalerweise vom Anfang einer Zeichenkette. Wenn Sie also einen Überträger verwenden, um Ihre Überschriften zu indizieren, kann ein Benutzer, der 't' eingibt, nur nach Überschriften suchen, die mit begonnen haben. Ich denke, die beste Wette für die Verwendung von mongodb, es sei denn, Sie haben große Mengen an Text, ist einfach die Verwendung regulärer Ausdrücke in Verbindung mit dem Operator $ oder.

Beim Änderungsereignis in einem Texteingabefeld möchten Sie, wie Sie sagten, eine AJAX-Anfrage an Ihren Knotenserver richten, der die Abfrage an mongodb ausgibt und die Ergebnisse in einem JSON-Array zurückgibt.

>

Reguläre Ausdrücke in Mongo: Ссылка

$ oder operator: Ссылка

Eine Demo, wie jQuery UI die automatische Vervollständigung durchführt (als Referenz für die AJAX-Anfrage und zum Ausfüllen von Werten): Ссылка

    
btoconnor 04.02.2012, 16:56
quelle