Mam dużą bazę danych (16M wierszy) zawierającą percepcyjne skróty obrazów.
Chciałbym móc wyszukiwać rzędy, zbijając odległość w rozsądnym czasie.
Obecnie, o ile dobrze rozumiem ten problem, myślę, że najlepszą opcją jest niestandardowa implementacja SP-GiST, która implementuje drzewo BK , ale wydaje się, że to dużo pracy, i wciąż jestem rozmyślany nad praktycznymi szczegóły dotyczące prawidłowego wdrażania indeksu niestandardowego. Obliczanie odległości uderzenia jest wystarczająco łatwe, ale znam C.
Zasadniczo, jakie jest tutaj właściwe podejście? Muszę być w stanie wyszukiwać dopasowania w obrębie określonej odległości edytowania skrótu. Jak rozumiem, odległość Levenshteina z łańcuchami o równej długości jest funkcjonalnie hamująca odległość, więc istnieje co najmniej pewne wsparcie dla tego, czego chcę, chociaż nie ma jasnego sposobu na utworzenie z niego indeksu (pamiętaj, o wartość, o którą pytam zmiany. Nie mogę wstępnie obliczyć odległości od stałej wartości, ponieważ byłoby to przydatne tylko dla tej jednej wartości).
Skróty są obecnie przechowywane jako 64-znakowy ciąg zawierający binarne kodowanie skrótu ASCII (np. „10010101 ...”), ale dość łatwo mogę przekonwertować je na int64. Prawdziwy problem polega na tym, że muszę stosunkowo szybko przesyłać zapytania.
Wydaje się, że można osiągnąć coś zgodnie z tym, czego chcę pg_trgm
, ale nie jestem pewien, jak działa mechamizm dopasowywania trygramu (w szczególności, co w rzeczywistości reprezentuje wskaźnik podobieństwa, który zwraca ? coś w rodzaju odległości do edycji).
Wydajność wstawiania nie jest krytyczna (obliczanie wartości skrótu dla każdego wiersza jest bardzo drogie obliczeniowo), więc przede wszystkim zależy mi na wyszukiwaniu.