Найти нечеткие дубликаты в строках с одним столбцом с помощью pg_trgm

Я пытался найти дубликаты в строках столбцов, но так как они нечеткие (не одно и то же значение, орфографические ошибки, пространство отступа), я должен использовать расширения pg_trgm и функцию Similarity(), чтобы найти их. Проблема в том, что этот запрос довольно длинный и неэффективный, даже если я размещаю все возможные индексы.

Моя настройка: PostgreSQL 11 pg_trgm включен имя таблицы:

id        col_name    fk_id
1         thing       2
2          thing      3
3         thing1      1
4         th1ng       4

В этой таблице почти 10 тысяч строк, просто чтобы понять, с чем я имею дело.

Я создал этот индекс:

CREATE INDEX CONCURRENTLY index_nameof_streets_trgm
ON tablename
USING gin (col_name gin_trgm_ops);

И запустил этот запрос (я не нашел другого способа сравнить строки столбца с самим собой, кроме самостоятельного соединения)

SELECT f1.col_name, f2.col_name, similarity(f1.col_name, f2.col_name)
FROM tablename f1 
INNER JOIN 
tablename f2 ON f1."Id" <> f2."Id"
WHERE similarity > 0.7

Блин, прошло более 1200 сек и до сих пор не закончено! (На самом деле, это не очень неожиданно, так как я получил это объяснение по запросу):

Nested Loop  (cost=0.00..1748422.51 rows=99870042 width=4)
  Join Filter: (f1."Id" <> f2."Id")
  ->  Seq Scan on "Streets" f1  (cost=0.00..260.94 rows=9994 width=37)
  ->  Materialize  (cost=0.00..310.91 rows=9994 width=37)
    ->  Seq Scan on "Streets" f2  (cost=0.00..260.94 rows=9994 width=37)

Я чувствую, что упускаю что-то простое и почти тупое, но не могу найти, что именно. Будем благодарны за любые подсказки о том, как найти нечеткие дубликаты в одной колонке! Спасибо:)

0 ответов

Другие вопросы по тегам