A abordagem mais fácil eu acho que seria:
- Crie duas novas tabelas:
keywords
(id, palavra) ekeywords_comments
(keyword_id, comment_id, contagem)keywords
salva um id exclusivo e a palavra-chave que você encontrou em um textokeywords_comments
armazena uma linha para cada conexão entre cada comentário que contém essa palavra-chave. Emcount
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).