Ich habe eine große Datenbank (16 Millionen Zeilen) mit wahrnehmbaren Hashes von Bildern.
Ich möchte in der Lage sein, nach Zeilen zu suchen, indem ich die Entfernung in einem angemessenen Zeitrahmen einschränke.
Derzeit denke ich, dass, soweit ich das Problem richtig verstehe, die beste Option hier eine benutzerdefinierte SP-GiST-Implementierung ist, die einen BK-Tree implementiert , aber das scheint eine Menge Arbeit zu sein, und ich bin immer noch unklar im praktischen Bereich Details zur ordnungsgemäßen Implementierung eines benutzerdefinierten Index. Die Berechnung der Hamming - Distanz ist lenkbar genug, und ich tun weiß , C, though.
Was ist hier grundsätzlich der richtige Ansatz? Ich muss in der Lage sein, Übereinstimmungen innerhalb einer bestimmten Bearbeitungsentfernung eines Hashs abzufragen. So wie ich es verstehe, ist Levenshtein-Abstand mit Zeichenfolgen gleicher Länge funktional ein Hamming-Abstand. Es gibt also zumindest eine gewisse Unterstützung für das, was ich möchte, obwohl es keine eindeutige Möglichkeit gibt, daraus einen Index zu erstellen (denken Sie daran, den Wert, nach dem ich frage) Ich kann den Abstand zu einem festen Wert nicht vorberechnen, da dies nur für diesen einen Wert sinnvoll wäre.
Die Hashes werden derzeit als 64-Zeichen-Zeichenfolge gespeichert, die die binäre ASCII-Codierung des Hashs enthält (z. B. "10010101 ..."), aber ich kann sie problemlos in int64 konvertieren. Das eigentliche Problem ist, dass ich in der Lage sein muss, relativ schnell abzufragen.
Es scheint möglich zu sein, etwas in der Art zu erreichen, wie ich es möchte pg_trgm
, aber ich bin mir ein wenig unklar, wie der Trigramm-Matching-Mechamismus funktioniert (insbesondere, welche Ähnlichkeitsmetrik gibt es tatsächlich wieder ? Es sieht aus Art wie Bearbeitungsentfernung).
Die Einfügeleistung ist nicht kritisch (es ist sehr rechenintensiv, die Hashes für jede Zeile zu berechnen), daher kümmere ich mich in erster Linie um die Suche.