Det enklaste tillvägagångssättet antar jag skulle vara:
- Skapa två nya tabeller:
keywords
(id, word) ochkeywords_comments
(keyword_id, comment_id, count)keywords
sparar ett unikt ID och nyckelordet du hittade i en textkeywords_comments
lagrar en rad för varje koppling mellan varje kommentar som innehåller det nyckelordet. Icount
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).