Найти нечеткие дубликаты в строках с одним столбцом с помощью pg_trgm - PullRequest
0 голосов
/ 30 января 2019

Я пытался найти дубликаты в строках столбцов, но поскольку они нечеткие (не одно и то же значение, орфографические ошибки, пространство отступа), я должен использовать расширения 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 000 строк, просто для понимания того, с чем я имею дело.

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

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)

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

...