Ho un grande database (16 milioni di righe) contenente hash percettivi di immagini.
Mi piacerebbe essere in grado di cercare file percorrendo la distanza in un lasso di tempo ragionevole.
Attualmente, per quanto comprendo correttamente il problema, penso che l'opzione migliore qui sarebbe un'implementazione SP-GiST personalizzata che implementa un BK-Tree , ma che sembra un sacco di lavoro, e sono ancora confuso sul pratico dettagli sull'implementazione corretta di un indice personalizzato. Calcolo della distanza di Hamming è abbastanza trattabili, e mi fa sapere C, però.
Fondamentalmente, qual è l' approccio appropriato qui? Devo essere in grado di interrogare le partite entro una certa distanza di modifica di un hash. A quanto ho capito, la distanza di Levenshtein con stringhe di uguale lunghezza è funzionalmente a percussione della distanza, quindi esiste almeno un supporto esistente per quello che voglio, anche se non esiste un modo chiaro per creare un indice da esso (ricorda, il valore per cui sto richiedendo non posso pre-calcolare la distanza da un valore fisso, poiché sarebbe utile solo per quel valore).
Gli hash sono attualmente memorizzati come una stringa di 64 caratteri contenente la codifica ASCII binaria dell'hash (es. "10010101 ..."), ma posso convertirli in int64 abbastanza facilmente. Il vero problema è che devo essere in grado di eseguire query relativamente velocemente.
Sembra che potrebbe essere possibile ottenere qualcosa pg_trgm
sulla falsariga di ciò che voglio con il , ma non sono abbastanza chiaro su come funzioni il mechamismo di corrispondenza del trigramma (in particolare, cosa rappresenta effettivamente la metrica di somiglianza che restituisce ? tipo di modifica-distanza).
Le prestazioni di inserimento non sono fondamentali (è molto costoso dal punto di vista computazionale calcolare gli hash per ogni riga), quindi mi interessa principalmente la ricerca.