Eu tenho um banco de dados grande (16 milhões de linhas) contendo hashes perceptivos de imagens.
Gostaria de poder pesquisar linhas impedindo a distância em um prazo razoável.
Atualmente, até onde eu entendi direito o problema, acho que a melhor opção aqui seria uma implementação personalizada do SP-GiST que implemente uma BK-Tree , mas isso parece muito trabalhoso e ainda estou confuso quanto à prática detalhes da implementação adequada de um índice personalizado. Calcular a distância de Hamming é suficiente tratável, e eu fazer sabe C, no entanto.
Basicamente, qual é a abordagem apropriada aqui? Eu preciso ser capaz de consultar correspondências dentro de uma certa distância de edição de um hash. Pelo que entendi, a distância de Levenshtein com cadeias de comprimento igual está prejudicando funcionalmente a distância, portanto há pelo menos algum suporte existente para o que eu quero, embora não haja uma maneira clara de criar um índice a partir dele (lembre-se, o valor que estou consultando Não consigo pré-calcular a distância de um valor fixo, pois isso seria útil apenas para esse valor).
Atualmente, os hashes são armazenados como uma cadeia de 64 caracteres contendo a codificação ASCII binária do hash (por exemplo, "10010101 ..."), mas posso convertê-los em int64 com bastante facilidade. O problema real é que preciso ser capaz de consultar relativamente rápido.
Parece que pode ser possível obter algo na linha do que eu quero com o pg_trgm
, mas não sei como funciona o mecanismo do trigrama correspondente (em particular, o que a métrica de similaridade que ele retorna realmente representa? tipo como editar distância).
O desempenho da pastilha não é crítico (é muito computacionalmente caro calcular os hashes para cada linha), então eu me preocupo principalmente com a pesquisa.