L'approccio più semplice immagino sarebbe:
- Crea due nuove tabelle:
keywords
(id, parola) ekeywords_comments
(id_parola chiave, ID_commento, conteggio)keywords
salva un ID univoco e la parola chiave che hai trovato in un testokeywords_comments
memorizza una riga per ogni connessione tra ogni commento che contiene quella parola chiave. Nelcount
salverai il numero di volte in cui questa parola chiave si è verificata nel commento. Le due colonne keyword_id + comment_id insieme formano una chiave univoca o direttamente la chiave primaria.
- Recupera tutti i commenti dal database
- Analizza tutti i commenti e li dividi per non caratteri (o altri limiti)
- Scrivi queste voci nelle tue tabelle
Esempio
Hai i seguenti due commenti:
Ora avresti iterato su entrambi e li avresti diviso per non caratteri. Ciò comporterebbe le seguenti parole minuscole per ogni testo:- Primo testo:ciao, come, sei, tu- Secondo testo:wow, ciao, mio, nome, è, stefan
Non appena avrai analizzato uno di questi testi, potrai già inserirlo nuovamente nel database. Immagino che tu non voglia caricare 100.000 commenti nella RAM.
Quindi andrebbe così:
- Analizza il primo testo e ottieni le parole chiave sopra
- Scrivi ogni parola chiave nella scheda
keywords
se non è ancora presente - Imposta un riferimento dalla parola chiave al commento (
keywords_comments
) e imposta il conteggio correttamente (nel nostro esempio ogni parola compare una sola volta in ogni testo, devi contare quella). - Analizza il secondo testo
- ...
Piccolo miglioramento
Un miglioramento molto semplice che probabilmente devi utilizzare per 100.000 commenti è utilizzare una variabile di conteggio oppure aggiungi un nuovo campo has_been_analyzed ad ogni commento. Quindi puoi leggerli commento per commento dal database.
Di solito uso le variabili di conteggio quando leggo i dati a blocchi e so che i dati non possono non cambiare dalla direzione in cui sto iniziando (cioè rimarranno coerenti fino al punto in cui sono attualmente). Quindi faccio qualcosa del tipo:
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
…
Considera che questo funziona solo se sappiamo per certo che non ci sono date da aggiungere in un luogo che pensiamo di aver già letto. Per esempio. utilizzando DESC
non funzionerebbe, in quanto potrebbero essere inseriti dei dati. Quindi l'intero offset si interromperebbe e leggeremmo un articolo due volte e non leggeremmo mai il nuovo articolo.
Se non puoi assicurarti che la variabile di conteggio esterna rimanga coerente, puoi aggiungere un nuovo campo analizzato che hai impostato su true non appena hai letto il commento. Quindi puoi sempre vedere quali commenti sono già stati letti e quali no. Una query SQL sarebbe quindi simile a questa:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */
Funziona finché non si parallelizza il carico di lavoro (con più client o thread). Altrimenti dovresti assicurarti che reading + setting true sia atomar (sincronizzato).