Najprostszym podejściem, jak sądzę, byłoby:
- Utwórz dwie nowe tabele:
keywords
(id, słowo) ikeywords_comments
(identyfikator_słowa kluczowego, identyfikator_komentarza, liczba)keywords
zapisuje unikalny identyfikator i słowo kluczowe znalezione w tekściekeywords_comments
przechowuje jeden wiersz dla każdego połączenia między każdym komentarzem zawierającym to słowo kluczowe. Wcount
zapiszesz, ile razy to słowo kluczowe wystąpiło w komentarzu. Dwie kolumny word_id + comment_id razem tworzą unikalny lub bezpośrednio klucz podstawowy.
- Pobierz wszystkie komentarze z bazy danych
- Przeanalizuj wszystkie komentarze i podziel je według nieznaków (lub innych granic)
- Zapisz te wpisy do swoich tabel
Przykład
Masz następujące dwa komentarze:
Teraz będziesz iterować nad nimi i podzielić je na nieznaki. Dałoby to w wyniku następujące słowa pisane małymi literami dla każdego tekstu:- Pierwszy tekst:cześć, jak, jesteś, ty- Drugi tekst:wow, cześć, moje, imię, is, stefan
Jak tylko przeanalizujesz jeden z tych tekstów, możesz go już ponownie wstawić do bazy danych. Myślę, że nie chcesz ładować 100.000 komentarzy do pamięci RAM.
Więc wyglądałoby to tak:
- Przeanalizuj pierwszy tekst i uzyskaj powyższe słowa kluczowe
- Zapisz każde słowo kluczowe w zakładce
keywords
jeśli jeszcze go tam nie ma - Ustaw odwołanie od słowa kluczowego do komentarza (
keywords_comments
) i poprawnie ustaw liczbę (w naszym przykładzie każde słowo występuje tylko raz w każdym tekście, musisz to policzyć). - Przeanalizuj drugi tekst
- …
Niewielka poprawa
Bardzo łatwym ulepszeniem, którego prawdopodobnie będziesz musiał użyć w przypadku 100 000 komentarzy, jest użycie zmiennej liczącej lub dodaj nowe pole has_been_analyzed do każdego komentarza. Następnie możesz je przeczytać komentarz po komentarzu z bazy danych.
Zwykle używam zmiennych liczących, gdy czytam dane fragmentarycznie i wiem, że dane nie mogą się zmienić z kierunku, w którym zaczynam (tj. pozostaną spójne do momentu, w którym obecnie jestem). Następnie robię coś takiego:
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
…
Weź pod uwagę, że to działa tylko wtedy, gdy wiemy na pewno, że nie ma żadnych dat do dodania w miejscu, które naszym zdaniem już przeczytaliśmy. Np. za pomocą DESC
nie zadziała, ponieważ mogą być wstawione dane. Wtedy całe przesunięcie by się zepsuło i przeczytalibyśmy jeden artykuł dwa razy i nigdy nie przeczytali nowego artykułu.
Jeśli nie możesz się upewnić, że zewnętrzna zmienna liczenia pozostaje spójna, możesz dodać nowe pole zanalizowane które ustawisz na true zaraz po przeczytaniu komentarza. Wtedy zawsze możesz zobaczyć, które komentarze zostały już przeczytane, a które nie. Zapytanie SQL wyglądałoby wtedy tak:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */
Działa to tak długo, jak długo nie zrównoleglasz obciążenia (z wieloma klientami lub wątkami). W przeciwnym razie musiałbyś upewnić się, że odczyt + ustawienie true jest atomarem (zsynchronizowanym).