sql >> Databasteknik >  >> RDS >> Mysql

Ta reda på de mest populära orden i MySQL / PHP

Det enklaste tillvägagångssättet antar jag skulle vara:

  • Skapa två nya tabeller:keywords (id, word) och keywords_comments (keyword_id, comment_id, count)
    • keywords sparar ett unikt ID och nyckelordet du hittade i en text
    • keywords_comments lagrar en rad för varje koppling mellan varje kommentar som innehåller det nyckelordet. I count du sparar antalet gånger detta nyckelord förekom i kommentaren. De två kolumnerna keyword_id + comment_id bildar tillsammans en unik eller direkt primärnyckel.
  • Hämta alla kommentarer från databasen
  • Parse igenom alla kommentarer och dela upp efter icke-tecken (eller andra gränser)
  • Skriv dessa poster till dina tabeller

Exempel

Du har följande två kommentarer:

Nu skulle du iterera över dem båda och dela upp dem efter icke-tecken. Detta skulle resultera i följande gemener för varje text:- Första texten:hej, hur, är, du- Andra text:wow, hej, min, namn, är, stefan

Så snart du har analyserat en av denna text kan du redan infoga den i databasen igen. Jag antar att du inte vill ladda 100 000 kommentarer till RAM.

Så det skulle gå så här:

  • Parsera den första texten och hämta sökorden ovan
  • Skriv in varje sökord i fliken keywords om den inte är där än
  • Ange en referens från nyckelordet till kommentaren (keywords_comments ) och ställ in antalet korrekt (i vårt exempel förekommer varje ord bara en gång i varje text, det måste du räkna).
  • Parse den andra texten
  • ...

Mindre förbättringar

En mycket enkel förbättring som du förmodligen måste använda för 100 000 kommentarer, är att använda en räknevariabel eller lägg till ett nytt fält has_been_analyzed till varje kommentar. Sedan kan du läsa dem kommentar för kommentar från databasen.

Jag använder vanligtvis räknevariabler när jag läser data i bitar och vet att data inte kan ändras från den riktning jag börjar (dvs. den kommer att förbli konsekvent till den punkt jag är för närvarande). Sedan gör jag något 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
…

Tänk på att detta bara fungerar om vi med säkerhet vet att det inte finns några datum att lägga till på en plats vi tror att vi redan har läst. T.ex. med DESC skulle inte fungera, eftersom det kan finnas data inlagda. Då skulle hela offsetet gå sönder och vi skulle läsa en artikel två gånger och aldrig läsa den nya artikeln.

Om du inte kan se till att den externa räkningsvariabeln förblir konsekvent kan du lägga till ett nytt fält analyserat som du ställer in på sant så fort du har läst kommentaren. Då kan du alltid se vilka kommentarer som redan är lästa och vilka som inte. En SQL-fråga skulle då se ut så här:

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

Detta fungerar så länge du inte parallelliserar arbetsbelastningen (med flera klienter eller trådar). Annars måste du se till att läsning + inställning sant är atomar (synkroniserad).




  1. ROWID motsvarighet i postgres 9.2

  2. Alternativ till Intersect i MySQL

  3. Postgres UPSERT återanvänd kolumnvärden från INSERT vid UPDATE

  4. Hur man gör för att skicka knapp, radera och uppdatera på samma formulär, php