sql >> Databáze >  >> RDS >> Mysql

Zjistěte nejoblíbenější slova v MySQL / PHP

Nejjednodušší přístup by asi byl:

  • Vytvořte dvě nové tabulky:keywords (id, word) a keywords_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 textu
    • keywords_comments ukládá jeden řádek pro každé spojení mezi každým komentářem, který obsahuje dané klíčové slovo. V count 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é).




  1. Získejte list Excelu do dočasné tabulky pomocí skriptu

  2. odkazování na více cizích klíčů php mysql

  3. Příklady vztahů mnoho k mnoha

  4. jak získat výsledek na základě 10minutového intervalu v mysql