Mysql
 sql >> база данни >  >> RDS >> Mysql

Открийте най-популярните думи в MySQL / PHP

Най-лесният подход според мен би бил:

  • Създайте две нови таблици: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 (синхронизирано).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инструкция SHOW TABLES с множество стойности LIKE

  2. Как вътрешното присъединяване работи върху връзка много към много, използвайки Doctrine и Symfony2

  3. Кеширане на MySQL заявки

  4. Как да се справяме с нулево поле при експортиране на MYSQL таблици в CSV

  5. Вмъкнете обект на двоичен низ на python в MySQL blob