Най-лесният подход според мен би бил:
- Създайте две нови таблици:
keywords
(id, дума) иkeywords_comments
(keyword_id, comment_id, брой)keywords
запазва уникален идентификатор и ключовата дума, която сте намерили в текстkeywords_comments
съхранява един ред за всяка връзка между всеки коментар, който съдържа тази ключова дума. Вcount
ще запазите броя на срещанията на тази ключова дума в коментара. Двете колони keyword_id + comment_id заедно образуват уникален или директно първичен ключ.
- Извличане на всички коментари от базата данни
- Разбирайте всички коментари и ги разделяйте по несимволи (или други граници)
- Напишете тези записи във вашите таблици
Пример
Имате следните два коментара:
Сега ще повторите и двата и ще ги разделите по незнаци. Това ще доведе до следните думи с малки букви за всеки текст:- Първи текст:здравей, как, си, ти - Втори текст:уау, здравей, мое, име, е, стефан
Веднага след като анализирате един от този текст, вече можете да го вмъкнете отново в базата данни. Предполагам, че не искате да зареждате 100 000 коментара в RAM.
Така че ще изглежда така:
- Разберете първия текст и вземете ключовите думи по-горе
- Напишете всяка ключова дума в раздела
keywords
ако все още не е там - Задайте препратка от ключовата дума към коментара (
keywords_comments
) и задайте правилно броя (в нашия пример всяка дума се среща само веднъж във всеки текст, трябва да преброите това). - Анализирайте втори текст
- …
Незначително подобрение
Много лесно подобрение, което вероятно трябва да използвате за 100 000 коментара, е да използвате брояща променлива или добавете ново поле has_been_analyzed към всеки коментар. След това можете да ги прочетете коментар по коментар от базата данни.
Обикновено използвам променливи за броене, когато чета данни на парчета и знам, че данните не могат да не се променят от посоката, в която започвам (т.е. ще останат последователни до момента, в който съм в момента). След това правя нещо като:
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
…
Помислете, че това работи само ако знаем със сигурност, че няма дати за добавяне на място, което смятаме, че вече сме чели. напр. използвайки DESC
няма да работи, тъй като може да има вмъкнати данни. Тогава целият офсет ще се счупи и ще прочетем една статия два пъти и никога няма да прочетем новата статия.
Ако не можете да се уверите, че външната променлива за броене остава последователна, можете да добавите ново поле анализирано което сте задали на true веднага щом сте прочели коментара. Тогава винаги можете да видите кои коментари вече са прочетени и кои не. Тогава една SQL заявка ще изглежда така:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */
Това работи, стига да не паралелизирате работното натоварване (с множество клиенти или нишки). В противен случай ще трябва да се уверите, че четенето + настройката true е atomar (синхронизирано).