sql >> Database >  >> RDS >> Mysql

Ontdek de meest populaire woorden in MySQL / PHP

De gemakkelijkste benadering zou volgens mij zijn:

  • Maak twee nieuwe tabellen:keywords (id, woord) en keywords_comments (keyword_id, comment_id, count)
    • keywords slaat een unieke id op en het trefwoord dat u in een tekst hebt gevonden
    • keywords_comments slaat één rij op voor elke verbinding tussen elke opmerking die dat trefwoord bevat. In count u slaat het aantal keren dat dit trefwoord voorkwam in de opmerking op. De twee kolommen keyword_id + comment_id vormen samen een unieke of direct de primaire sleutel.
  • Haal alle opmerkingen op uit de database
  • Ontdek alle opmerkingen en splits ze op niet-tekens (of andere grenzen)
  • Schrijf deze gegevens op uw tafels

Voorbeeld

Je hebt de volgende twee opmerkingen:

Nu zou je beide herhalen en ze splitsen door niet-tekens. Dit zou resulteren in de volgende kleine letters voor elke tekst:- Eerste tekst:hallo, how, are, you- Tweede tekst:wow, hallo, my, name, is, stefan

Zodra je een van deze tekst hebt geparseerd, kun je deze al weer in de database invoegen. Ik neem aan dat je 100.000 reacties niet in het RAM wilt laden.

Dus het zou zo gaan:

  • De eerste tekst ontleden en de bovenstaande zoekwoorden ophalen
  • Schrijf elk zoekwoord in het tabblad keywords als het er nog niet is
  • Stel een verwijzing in van het trefwoord naar de opmerking (keywords_comments ) en stel de telling correct in (in ons voorbeeld komt elk woord maar één keer voor in elke tekst, dat moet je tellen).
  • Tweede tekst ontleden

Kleine verbetering

Een heel gemakkelijke verbetering die je waarschijnlijk moet gebruiken voor 100.000 reacties, is het gebruik van een telvariabele of voeg een nieuw veld toe has_been_analyzed bij elke opmerking. Dan kun je ze commentaar voor commentaar uit de database lezen.

Ik gebruik meestal telvariabelen wanneer ik gegevens in stukjes lees en weet dat de gegevens niet kunnen veranderen van de richting waarin ik begin (d.w.z. het blijft consistent tot het punt dat ik momenteel ben). Dan doe ik zoiets als:

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
…

Bedenk dat dit alleen werkt als we zeker weten dat er geen datums toegevoegd kunnen worden op een plaats waarvan we denken dat we ze al gelezen hebben. bijv. met behulp van DESC zou niet werken, omdat er gegevens kunnen worden ingevoegd. Dan zou de hele offset breken en zouden we één artikel twee keer lezen en nooit het nieuwe artikel lezen.

Als u er niet voor kunt zorgen dat de externe telvariabele consistent blijft, kunt u een nieuw veld toevoegen analyzed die u op true heeft gezet zodra u de opmerking hebt gelezen. Dan kun je altijd zien welke reacties al zijn gelezen en welke niet. Een SQL-query ziet er dan als volgt uit:

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

Dit werkt zolang u de werklast niet parallelliseert (met meerdere clients of threads). Anders zou u ervoor moeten zorgen dat lezen + instelling waar is atomar (gesynchroniseerd).




  1. Substring met Oracle Wanneer er meerdere Matches zijn?

  2. MySQL-query om kolomnamen te krijgen?

  3. Standaard numerieke notatietekenreeksen ondersteund door FORMAT() in SQL Server

  4. dynamisch getal van waar-voorwaarde in orakel sql