Это похоже на задачу для pg_trgm . Он предоставляет вам оператор %
, который возвращает истину, если две строки «достаточно близки». Вы можете настроить, что означает «достаточно близко», изменив pg_trgm.similarity_threshold. Вы можете создать индекс, чтобы ускорить эту операцию. Чем выше значение Similarity_threshold, тем большего ускорения вы, вероятно, достигнете.
Если я возьму вам сначала показанную таблицу как foo1, а все отдельные заголовки из желаемого результата как foo2, тогда этот запрос даст разумные результаты:
select *, foo1.title <-> foo2.title as distance from foo2 left join foo1 on foo1.title % foo2.title;
title | id | title | distance
--------------------------------------+--------+-------------------+-----------
The Hunger Games: Mockingjay Part I | 2 | The Hunger Games | 0.5142857
The Hunger Games: Mockingjay Part II | 2 | The Hunger Games | 0.5277778
John Wick (2014) | 3 | John Wick | 0.3333333
John Wick Chapter 2 | 3 | John Wick | 0.5
Alien | 1 | Aliens | 0.375
Alien | 4 | Alien vs Predator | 0.6666666
Aliens | 1 | Aliens | 0
Alien 3 | 1 | Aliens | 0.5
Alien 3 | 4 | Alien vs Predator | 0.7
Lord of the Rings | (null) | (null) | (null)
Если вам нужна одна выходная строка для каждого foo2, показывающая только «лучшее» совпадение, тогда вы должны использовать LEFT JOIN LATERAL:
select *, a.title <-> foo2.title as distance from foo2 left join lateral
(select * from foo1 where foo1.title % foo2.title order by foo1.title <-> foo2.title limit 1) a
on true;
title | id | title | distance
--------------------------------------+--------+------------------+-----------
The Hunger Games: Mockingjay Part I | 2 | The Hunger Games | 0.5142857
The Hunger Games: Mockingjay Part II | 2 | The Hunger Games | 0.5277778
John Wick (2014) | 3 | John Wick | 0.3333333
John Wick Chapter 2 | 3 | John Wick | 0.5
Alien | 1 | Aliens | 0.375
Aliens | 1 | Aliens | 0
Alien 3 | 1 | Aliens | 0.5
Lord of the Rings | (null) | (null) | (null)
Как заменить NULL в столбце «id» (где нет достаточно близких совпадений) с вновь созданным идентификатором - это отдельный вопрос, и вам следует задавать отдельные вопросы отдельно.
Для любых наборов данных реалистичного размера это маловероятно вы могли бы просто слепо принимать любые запросы, подобные приведенному выше, по крайней мере, если вы хотите получить высококачественные результаты. Скорее, вы могли бы заставить компьютер сгенерировать что-то вроде вышеперечисленного в качестве рекомендаций, а затем предложить их (в удобном интерфейсе) для ратификации, отклонения или дальнейшего изучения человеком.