Estou trabalhando em um aplicativo que requer a criação de um banco de dados muito grande de n-gramas que existem em um corpus de texto grande.
Preciso de três tipos de operação eficientes: pesquisa e inserção indexadas pelo próprio n-grama e consulta de todos os n-gramas que contêm um sub-n-grama.
Parece-me que o banco de dados deve ser uma árvore de documentos gigantesca, e os bancos de dados de documentos, como o Mongo, devem ser capazes de fazer o trabalho bem, mas nunca os usei em escala.
Conhecendo o formato da pergunta Stack Exchange, gostaria de esclarecer que não estou pedindo sugestões sobre tecnologias específicas, mas um tipo de banco de dados que eu deveria estar procurando para implementar algo assim em escala.
Respostas:
Veja Lucene NGramTokenizer
Tem certeza de que não pode usar apenas lucene ou técnicas de indexação semelhantes?
Os índices invertidos armazenam o n-grama apenas uma vez, e apenas os IDs do documento que contêm o ngram; eles não armazenam isso como texto bruto altamente redundante.
Quanto a encontrar ngrams que contenham seu sub-grama de consulta, eu criaria um índice nos ngrams observados, por exemplo, usando um segundo índice lucene ou qualquer outro índice de substring , como uma árvore trie ou sufixo. Se seus dados são dinâmicos, provavelmente o lucene é uma escolha razoável, usando consultas de frase para encontrar seus n-gramas.
fonte
Basicamente, para esta tarefa, você pode usar eficientemente qualquer banco de dados SQL, com bom suporte de índices baseados em árvore B + (o MySQL fornecerá o que você precisa, perfeito).
Crie 3 tabelas:
Crie índices na tabela N-grama / sequência n_gram e na tabela Mapeamento / n_gram_id, também as chaves primárias serão indexadas também por padrão.
Suas operações serão eficientes:
Você nem precisa usar junções para realizar todas essas operações, para que os índices ajudem bastante. Além disso, se os dados não se encaixarem em uma máquina - você pode implementar o esquema de sharding, como armazenar n_grams iniciados em um servidor e oz em outro ou em outro esquema adequado.
Além disso, você pode usar o MongoDB, mas não sei exatamente como é necessário implementar o esquema de indexação. Para o MongoDB, você obterá o esquema de sharding gratuitamente, pois ele já está embutido.
fonte
Eu não fiz isso antes, mas parece um trabalho para um banco de dados de gráficos, dada a funcionalidade que você deseja. Aqui está uma demonstração no neo4j .
fonte