У меня есть большая база данных (16 миллионов строк), содержащая перцептивные хеши изображений.
Я хотел бы иметь возможность искать строки по расстоянию Хэмминга в разумные сроки.
В настоящее время, насколько я правильно понимаю проблему, я думаю, что лучшим вариантом здесь была бы пользовательская реализация SP-GiST, которая реализует BK-Tree , но это кажется большой работой, и я все еще не совсем уверен в практической детали правильной реализации пользовательского индекса. Расчет расстояния Хэмминга достаточно податлив, и я все же знаю C.
В принципе, то , что является подходящим подходом здесь? Мне нужно иметь возможность запрашивать совпадения в пределах определенного расстояния редактирования хэша. Насколько я понимаю, расстояние Левенштейна со строками равной длины - это функциональное расстояние Хемминга, так что есть, по крайней мере, некоторая существующая поддержка того, что я хочу, хотя нет четкого способа создать из него индекс (помните, значение, которое я запрашиваю для изменения. Я не могу предварительно вычислить расстояние от фиксированного значения, так как это было бы полезно только для этого одного значения).
Хеши в настоящее время хранятся в виде строки из 64 символов, содержащей двоичную ASCII-кодировку хеша (например, «10010101 ...»), но я могу достаточно легко преобразовать их в int64. Реальная проблема в том, что мне нужно уметь делать запросы относительно быстро.
Кажется, что можно достичь чего-то в соответствии с тем, что я хочу с помощью pg_trgm
, но мне немного неясно, как работает механизм сопоставления триграмм (в частности, что на самом деле представляет метрика сходства, которую он возвращает ? вроде как расстояние редактирования).
Производительность вставки не критична (вычислять хэши для каждой строки очень дорого в вычислительном отношении), поэтому я в первую очередь забочусь о поиске.