Effiziente serverseitige Autocomplete

8

Zunächst einmal alles, was ich weiß:

  

Vorzeitige Optimierung ist die Wurzel allen Übels

Aber ich denke, dass falsche Autovervollständigung Ihre Website wirklich sprengen kann.

Ich würde wissen, ob es irgendwelche Bibliotheken gibt, die eine automatische Vervollständigung (serverseitig) durchführen können, die vorzugsweise in den RAM passen (für die beste Leistung). Also keine browserseitige Javascript-Vervollständigung (yui / jquery / dojo). Ich denke, es gibt genügend Thema auf Stackoverflow. Aber ich konnte im Stackoverflow keinen guten Thread darüber finden (vielleicht sah ich nicht gut genug aus).

Zum Beispiel Namen automatisch vervollständigen:

%Vor%

Woran ich denken kann:

  • einfaches SQL wie zum Beispiel: SELECT name FROM users WHERE name LIKE al% .
    • Ich denke, dass diese Implementierung mit vielen simultanen Benutzern oder großen Datensätzen explodieren wird, aber vielleicht liege ich falsch, so dass Zahlen (die bearbeitet werden könnten) cool wären.
  • Verwenden Sie so etwas wie solr Begriffe wie zum Beispiel: http://localhost:8983/solr/terms?terms.fl=name&terms.sort=index&terms.prefix=al&wt=json&omitHeader=true .
    • Ich kenne die Leistung von diesem nicht, so dass Benutzer mit großen Websites mir bitte sagen.
  • Vielleicht etwas wie in Speicherwiederherstellung , auf dem ich auch die Leistung nicht getestet habe.
  • Ich lese auch in diesem Thread darüber, wie man das in java (Lucene und einige Bibliothek erstellt von shilad)

Was ich gerne hören würde, ist die Implementierung, die von Seiten verwendet wird, und die Anzahl, wie gut sie mit load umgehen kann, vorzuziehen mit:

  • Link zu Implementierung oder Code.
  • Zahlen, zu denen Sie wissen, dass sie skaliert werden können.
  • Es wäre schön, wenn es durch http oder Sockets erreichbar wäre.

Vielen Dank,
Alfred

    
Alfred 08.01.2010, 01:27
quelle

3 Antworten

10

Optimierung für Auto-Vervollständigung

Leider hängt die Lösung dieses Problems stark von den Daten ab, die Sie abfragen möchten.

LIKE-Abfragen werden Ihre Datenbank nicht zu sehr belasten, solange Sie Zeit mit 'EXPLAIN' oder dem Profiler verbringen, um Ihnen zu zeigen, wie der Abfrageoptimierer Ihre Abfrage durchführen möchte.

Einige Dinge, die Sie beachten sollten:

  • Indizes: Stellen Sie sicher, dass Sie Indizes eingerichtet haben. (Ja, in vielen Fällen verwendet LIKE die Indizes. Es gibt einen ausgezeichneten Artikel zum Thema bei myitforum. SQL-Leistung - Indizes und die LIKE-Klausel ).

  • Joins: Stellen Sie sicher, dass Ihre JOINs vorhanden sind und vom Abfrageplaner optimiert werden. SQL Server Profiler kann dabei helfen. Suchen Sie nach vollständigen Index- oder vollständigen Tabellenscans

Teilsätze automatisch vervollständigen

Auto-Complete-Abfragen sind ein Sonderfall, da sie normalerweise immer weniger Subsets verwenden.

  • 'name' LIKE 'a%' (kann 10000 Datensätze zurückgeben)
  • 'name' LIKE 'al% '(kann 500 Datensätze zurückgeben)
  • 'name' LIKE 'ala%' (kann 75 Datensätze zurückgeben)
  • 'name' LIKE 'alan%' (kann 20 Datensätze zurückgeben)

Wenn Sie die gesamte Ergebnismenge für Abfrage 1 zurückgeben, müssen Sie die Datenbank nicht erneut für die folgenden Ergebnismengen treffen, da es sich um eine Untergruppe Ihrer ursprünglichen Abfrage handelt.

Abhängig von Ihren Daten kann dies eine weitere Möglichkeit zur Optimierung eröffnen.

    
Jon Winstanley 21.01.2010, 17:22
quelle
6

Ich werde Ihren Anforderungen nicht nachkommen und die Größenordnungen hängen natürlich von der Hardware, der Größe der Datenbank, der Architektur der App und einigen anderen Dingen ab. Sie müssen es selbst testen.

Aber ich werde Ihnen die Methode, die ich mit Erfolg verwendet habe, sagen:

  • Verwenden Sie ein einfaches SQL wie zum Beispiel: SELECT name FROM users WHERE name LIKE al%. , aber verwenden Sie TOP 100 , um die Anzahl der Ergebnisse zu begrenzen.
  • Speichern Sie die Ergebnisse zwischen und speichern Sie eine Liste der Begriffe, die zwischengespeichert werden
  • Wenn eine neue Anfrage eingeht, prüfen Sie zuerst in der Liste, ob Sie den Begriff (oder einen Teil des Begriffs im Cache) haben.
  • Denken Sie daran, dass Ihre gecachten Ergebnisse begrenzt sind. Einige müssen möglicherweise eine SQL-Abfrage durchführen, wenn der Begriff am Ende des Ergebnisses gültig bleibt (ich meine gültig, wenn das letzte Ergebnis mit dem Begriff übereinstimmt.

Ich hoffe, es hilft.

    
Eduardo Molteni 21.01.2010 17:24
quelle
1

Die Verwendung von SQL im Vergleich zu Solrs Begriffen ist kein Vergleich. In ihrem Kern lösen sie das Problem auf die gleiche Weise, indem sie einen Index erstellen und dann einfache Aufrufe dazu machen.

Was ich wissen möchte, ist "was Sie versuchen, automatisch zu vervollständigen".

Letztlich ist der einfachste und sicherste Weg, ein System zu skalieren, eine einfache Lösung zu erstellen und das System dann einfach zu skalieren, indem Daten repliziert werden. Der Versuch, Aufrufe zu cachen oder Ergebnisse vorherzusagen, macht die Dinge nur kompliziert und bringt Sie nicht zum Ursprung des Problems (dh Sie können sie nur so weit nehmen, als ob jede Anfrage den Cache verpasst hätte).

Vielleicht wäre ein wenig mehr hilfreich, wie Ihre Daten strukturiert sind und wie Sie sie extrahieren möchten.

    
mlathe 27.01.2010 02:00
quelle