sql >> Database teknologi >  >> RDS >> Mysql

Find ud af de mest populære ord i MySQL / PHP

Den nemmeste tilgang tror jeg ville være:

  • Opret to nye tabeller:keywords (id, word) og keywords_comments (keyword_id, comment_id, count)
    • keywords gemmer et unikt id og det søgeord, du fandt i en tekst
    • keywords_comments gemmer en række for hver forbindelse mellem hver kommentar, der indeholder det pågældende søgeord. I count du vil gemme antallet af gange dette søgeord opstod i kommentaren. De to kolonner keyword_id + comment_id danner tilsammen en unik eller direkte primærnøgle.
  • Hent alle kommentarer fra databasen
  • Parse gennem alle kommentarer og opdel efter ikke-tegn (eller andre grænser)
  • Skriv disse poster til dine tabeller

Eksempel

Du har følgende to kommentarer:

Nu ville du gentage dem begge og opdele dem efter ikke-tegn. Dette ville resultere i følgende ord med små bogstaver for hver tekst:- Første tekst:hej, hvordan, er, du- Anden tekst:wow, hej, min, navn, er, stefan

Så snart du har parset en af ​​denne tekst, kan du allerede indsætte den i databasen igen. Jeg gætter på, at du ikke ønsker at indlæse 100.000 kommentarer til RAM.

Så det ville gå sådan her:

  • Gennemfør den første tekst og få søgeordene ovenfor
  • Skriv hvert søgeord i fanebladet keywords hvis den ikke er der endnu
  • Indstil en reference fra søgeordet til kommentaren (keywords_comments ) og indstil antallet korrekt (i vores eksempel forekommer hvert ord kun én gang i hver tekst, det skal du tælle).
  • Parse anden tekst
  • ...

Mindre forbedring

En meget nem forbedring, du sandsynligvis skal bruge til 100.000 kommentarer, er at bruge en tællevariabel eller tilføj et nyt felt has_been_analyzed til hver kommentar. Så kan du læse dem kommentar for kommentar fra databasen.

Jeg bruger normalt tællevariabler, når jeg læser data i stykker og ved, at dataene ikke kan ændre sig fra den retning, jeg starter (dvs. de vil forblive konsekvente indtil det punkt, jeg er i øjeblikket). Så laver jeg noget som:

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
…

Overvej, at dette kun virker, hvis vi med sikkerhed ved, at der ikke er nogen datoer, der skal tilføjes et sted, vi tror, ​​vi allerede har læst. For eksempel. ved hjælp af DESC ville ikke virke, da der kunne være indsat data. Så ville hele offset gå i stykker, og vi ville læse en artikel to gange og aldrig læse den nye artikel.

Hvis du ikke kan sikre dig, at den eksterne tællevariabel forbliver konsistent, kan du tilføje et nyt felt analyseret som du sætter til sand, så snart du har læst kommentaren. Så kan du altid se, hvilke kommentarer der allerede er læst, og hvilke der ikke. En SQL-forespørgsel ville så se sådan ud:

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

Dette virker, så længe du ikke paralleliserer arbejdsbyrden (med flere klienter eller tråde). Ellers skal du sikre dig, at læsning + indstilling sand er atomar (synkroniseret).




  1. ECONNRESET fejl ved nedbrud af NodeJS-applikation

  2. Kolonneoverskrifter bliver ved med at dukke op i hele Oracle-output

  3. Er der en SQL-tilstand for MySQL, der tillader WHERE x =NULL (hvilket betyder WHERE x IS NULL)?

  4. Sådan kortslutter du SQL Where-klausul