Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Descubra as palavras mais populares em MySQL / PHP


A abordagem mais fácil eu acho que seria:
  • Crie duas novas tabelas:keywords (id, palavra) e keywords_comments (keyword_id, comment_id, contagem)
    • keywords salva um id exclusivo e a palavra-chave que você encontrou em um texto
    • keywords_comments armazena uma linha para cada conexão entre cada comentário que contém essa palavra-chave. Em count você salvará o número de vezes que esta palavra-chave ocorreu no comentário. As duas colunas keyword_id + comment_id juntas formam uma única ou diretamente a chave primária.
  • Recuperar todos os comentários do banco de dados
  • Analisar todos os comentários e dividir por não caracteres (ou outros limites)
  • Grave essas entradas em suas tabelas

Exemplo


Você tem os dois comentários a seguir:

Agora você iteraria sobre ambos e os dividiria por não caracteres. Isso resultaria nas seguintes palavras minúsculas para cada texto:- Primeiro texto:olá, como, você é - Segundo texto:uau, olá, meu, nome, é, stefan

Assim que você tiver analisado um desses textos, já poderá inseri-lo novamente no banco de dados. Eu acho que você não quer carregar 100.000 comentários na RAM.

Então ficaria assim:
  • Analisar o primeiro texto e obter as palavras-chave acima
  • Escreva cada palavra-chave na guia keywords se ainda não estiver lá
  • Defina uma referência da palavra-chave para o comentário (keywords_comments ) e defina a contagem corretamente (no nosso exemplo, cada palavra ocorre apenas uma vez em cada texto, você deve contar isso).
  • Analisar o segundo texto

Pequena melhoria


Uma melhoria muito fácil que você provavelmente terá que usar para 100.000 comentários é usar uma variável de contagem ou adicione um novo campo has_been_analyzed a cada comentário. Então você pode lê-los comentário por comentário do banco de dados.

Eu costumo usar variáveis ​​de contagem quando leio dados em partes e sei que os dados não podem mudar da direção em que estou iniciando (ou seja, permanecerão consistentes até o ponto em que estou atualmente). Então eu faço algo como:
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
…

Considere que isso só funciona se tivermos certeza de que não há datas a serem adicionadas em um local que achamos que já lemos. Por exemplo. usando DESC não funcionaria, pois poderia haver dados inseridos. Então todo o deslocamento seria interrompido e nós líamos um artigo duas vezes e nunca líamos o novo artigo.

Se você não puder garantir que a variável de contagem externa permaneça consistente, adicione um novo campo analisado que você define como verdadeiro assim que ler o comentário. Então você sempre pode ver quais comentários já foram lidos e quais não. Uma consulta SQL ficaria assim:
SELECT * FROM table WHERE analyzed = 0 LIMIT 100 /* Reading chunks of 100 */

Isso funciona desde que você não paralelize a carga de trabalho (com vários clientes ou encadeamentos). Caso contrário, você teria que garantir que a leitura + configuração true seja atomar (sincronizada).