Nejjednodušší přístup by asi byl:
- Vytvořte dvě nové tabulky:
keywords
(id, word) akeywords_comments
(id_klíčového slova, id_komentáře, počet)keywords
uloží jedinečné ID a klíčové slovo, které jste našli v textukeywords_comments
ukládá jeden řádek pro každé spojení mezi každým komentářem, který obsahuje dané klíčové slovo. Vcount
do komentáře uložíte, kolikrát se toto klíčové slovo vyskytlo. Dva sloupce keyword_id + comment_id společně tvoří jedinečný nebo přímo primární klíč.
- Načíst všechny komentáře z databáze
- Projděte všechny komentáře a rozdělte je podle neznaků (nebo jiných hranic)
- Zapište tyto položky do svých tabulek
Příklad
Máte následující dva komentáře:
Nyní byste je iterovali přes oba a rozdělili je podle neznaků. Výsledkem by byla následující malá písmena pro každý text:- První text:ahoj, jak, jsi, ty- Druhý text:wow, ahoj, moje, jméno, je, stefan
Jakmile jeden z těchto textů analyzujete, můžete jej znovu vložit do databáze. Myslím, že nechcete načítat 100 000 komentářů do RAM.
Takže by to šlo takto:
- Analyzujte první text a získejte klíčová slova výše
- Zapište každé klíčové slovo do záložky
keywords
pokud tam ještě není - Nastavte odkaz z klíčového slova na komentář (
keywords_comments
) a nastavte správně počet (v našem příkladu se každé slovo vyskytuje v každém textu pouze jednou, musíte to počítat). - Analyzujte druhý text
- …
Drobné vylepšení
Velmi snadným vylepšením, které pravděpodobně budete muset použít pro 100 000 komentářů, je použití počítací proměnné nebo přidejte nové pole has_been_analyzed ke každému komentáři. Poté si je můžete přečíst komentář po komentáři z databáze.
Obvykle používám počítací proměnné, když čtu data po částech a vím, že se data nemohou změnit ze směru, ve kterém začínám (tj. zůstanou konzistentní až do bodu, ve kterém momentálně jsem). Pak udělám něco jako:
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
…
Zvažte, že to funguje pouze v případě, že s jistotou víme, že na místě, o kterém si myslíme, že jsme ho již četli, nejsou přidána žádná data. Např. pomocí DESC
by nefungovalo, protože by mohla být vložena data. Pak by se celý offset zlomil a my bychom si jeden článek přečetli dvakrát a nikdy nový článek.
Pokud nemůžete zajistit, aby proměnná vnějšího počítání zůstala konzistentní, můžete přidat nové pole analyzováno kterou nastavíte na true, jakmile si přečtete komentář. Pak můžete vždy vidět, které komentáře již byly přečteny a které ne. SQL dotaz by pak vypadal takto:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */
To funguje, pokud neprovádíte paralelizaci pracovní zátěže (s více klienty nebo vlákny). Jinak byste se museli ujistit, že čtení + nastavení true je atomární (synchronizované).