Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Finden Sie die beliebtesten Wörter in MySQL / PHP heraus

Der einfachste Ansatz wäre meiner Meinung nach:

  • Erstellen Sie zwei neue Tabellen:keywords (ID, Wort) und keywords_comments (keyword_id, comment_id, count)
    • keywords speichert eine eindeutige ID und das gefundene Schlüsselwort in einem Text
    • keywords_comments speichert eine Zeile für jede Verbindung zwischen jedem Kommentar, der dieses Schlüsselwort enthält. In count Sie werden speichern, wie oft dieses Schlüsselwort im Kommentar vorkommt. Die beiden Spalten keyword_id + comment_id bilden zusammen einen eindeutigen oder direkt den Primärschlüssel.
  • Alle Kommentare aus der Datenbank abrufen
  • Alle Kommentare analysieren und nach Nichtzeichen (oder anderen Grenzen) aufteilen
  • Schreiben Sie diese Einträge in Ihre Tabellen

Beispiel

Sie haben die folgenden zwei Kommentare:

Jetzt würden Sie über beide iterieren und sie durch Nicht-Zeichen aufteilen. Daraus ergäben sich für jeden Text folgende Kleinbuchstaben:- Erster Text:hallo, wie, geht es, du- Zweiter Text:wow, hallo, mein, name, ist, stefan

Sobald Sie einen dieser Texte geparst haben, können Sie ihn bereits wieder in die Datenbank einfügen. Ich schätze, Sie wollen nicht 100.000 Kommentare in den Arbeitsspeicher laden.

So würde es gehen:

  • Parsen Sie den ersten Text und erhalten Sie die Schlüsselwörter oben
  • Schreiben Sie jedes Schlüsselwort in die Registerkarte keywords falls es noch nicht da ist
  • Verweise vom Keyword auf den Kommentar setzen (keywords_comments ) und setze die Zählung richtig (in unserem Beispiel kommt jedes Wort nur einmal in jedem Text vor, das musst du zählen).
  • Zweiten Text parsen

Kleine Verbesserung

Eine sehr einfache Verbesserung, die Sie wahrscheinlich für 100.000 Kommentare verwenden müssen, ist die Verwendung einer Zählvariable oder fügen Sie ein neues Feld has_been_analyzed hinzu zu jedem Kommentar. Dann können Sie sie Kommentar für Kommentar aus der Datenbank lesen.

Normalerweise verwende ich Zählvariablen, wenn ich Daten bruchstückweise lese und weiß, dass sich die Daten nicht von der Richtung ändern können, in der ich beginne (d. H. Sie bleiben bis zu dem Punkt, an dem ich mich gerade befinde, konsistent). Dann mache ich so etwas wie:

SELECT * FROM table ORDER BY created ASC LIMIT 0, 100
SELECT * FROM table ORDER BY created ASC LIMIT 100, 100
SELECT * FROM table ORDER BY created ASC LIMIT 200, 100
…

Bedenken Sie, dass dies nur funktioniert, wenn wir sicher wissen, dass an einer Stelle, von der wir glauben, dass wir sie bereits gelesen haben, keine Daten hinzugefügt werden müssen. Z.B. mit DESC würde nicht funktionieren, da Daten eingefügt werden könnten. Dann würde der ganze Offset brechen und wir würden einen Artikel zweimal lesen und den neuen Artikel nie lesen.

Wenn Sie nicht sicherstellen können, dass die äußere Zählvariable konsistent bleibt, können Sie ein neues Feld analysiert hinzufügen die Sie auf true setzen, sobald Sie den Kommentar gelesen haben. Dann können Sie jederzeit sehen, welche Kommentare bereits gelesen wurden und welche nicht. Eine SQL-Abfrage würde dann so aussehen:

SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */

Dies funktioniert, solange Sie die Arbeitslast nicht parallelisieren (mit mehreren Clients oder Threads). Andernfalls müssten Sie sicherstellen, dass das Lesen + Setzen auf true atomar (synchronisiert) ist.