Pergunta

Eu estou construindo um índice dos dados, o que implicará o armazenamento de lotes de trigêmeos na (document, term, weight) formulário. I será armazenar até alguns milhões de tais linhas. Atualmente eu estou fazendo isso no MySQL como uma tabela simples. Eu estou armazenando os identificadores de documento e prazo como valores de cadeia do que as chaves estrangeiras para outras tabelas. Estou re-escrever o software e à procura de melhores formas de armazenar os dados.

Olhando para a forma HBase funciona, isso parece se encaixar no esquema muito bem. Em vez de armazenar lotes de trigêmeos, eu poderia mapear document para {term => weight}.

eu estou fazendo isso em um único nó , então eu não me importo com distribuído nós etc. Devo ficar com MySQL porque ele funciona, ou seria sensato tentar HBase? Vejo que Lucene usa-lo para indexação de texto completo (que é análogo ao que eu estou fazendo). A minha pergunta é realmente como é que um único nó HBase comparar com um nó MySQL single? Estou vindo de Scala, assim pode um direto Java API têm uma vantagem sobre JDBC e MySQL análise etc cada consulta?

A minha principal preocupação é a velocidade de inserção, como que tem sido o gargalo anteriormente. Após o processamento, eu provavelmente vai acabar colocando a parte traseira de dados em MySQL para live-consulta porque eu preciso fazer alguns cálculos que são melhor feitos dentro de MySQL.

Vou tentar prototipagem tanto, mas tenho certeza que a comunidade pode me dar alguns insights valiosos sobre isso.

Foi útil?

Solução

Use a ferramenta certa para o trabalho.

Há uma série de sistemas de bases de anti-RDBMSs ou (basicamente disponível, soft state, Eventualmente consistente), ao contrário de ACID (atomicidade, consistência, isolamento, durabilidade) para escolher aqui e aqui .

Eu usei RDBMSs tradicional e embora você pode armazenar CLOBs / BLOBs, eles fazem não têm built-in índices personalizados especificamente para pesquisar esses objetos.

Você quer fazer a maioria do trabalho (o cálculo da frequência ponderada para cada tupla encontrado) ao inserir um documento.

Você também pode querer fazer algum trabalho marcando a utilidade de cada (documentId, searchword) par depois de cada pesquisa.

Dessa forma, você pode dar uma melhor e melhores pesquisas de cada vez.

Você também deseja armazenar uma pontuação ou peso para cada pesquisa e ponderada pontuações para semelhança com outras pesquisas.

É provável que algumas pesquisas são mais comuns do que outros e que os usuários não são fraseado sua consulta de pesquisa corretamente que eles significam fazer uma pesquisa comum.

Como inserir um documento também deve causar alguma mudança ao peso pesquisa índices.

Quanto mais penso nisso, mais complexa a solução torna-se. Você tem que começar com um bom design em primeiro lugar. Quanto mais fatores de seu projeto antecipa, melhor o resultado.

Outras dicas

MapReduce parece ser uma ótima maneira de gerar as tuplas. Se você pode conseguir um emprego scala em um arquivo JAR (não tenho certeza porque eu não usei scala antes e sou um n00b JVM), que seria uma simples questão de enviá-lo ao longo e escrever um pouco de um invólucro para executá-lo no mapa reduzir cluster.

Como para armazenar as tuplas depois que você fez, você também pode querer considerar um banco de dados com base em documentos como mongodb se você está apenas armazenando tuplas.

Em geral, parece que você está fazendo algo mais estatística com os textos ... Já pensou simplesmente usando Lucene ou Solr para fazer o que você está fazendo em vez de escrever o seu próprio?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top