Поиск дубликатов текстовых записей
Есть база данных с текстовым полем, в котором хранятся собственно говоря посты (от 0 до нескольких кб длиной). Мне нужно найти все дубликаты текстов в этой колонке и пометить их специальным флагом (для флага я выбрал отдельное поле).
Я придумал такой алгоритм, но очень не уверен в его оптимальности с точки зрения ресурсозатрат:
выбираю один пост с пустым флагом.
С помощью конструкции
SELECT id, data, MATCH (data) AGAINST (?s) AS score FROM table WHERE ?p ORDER BY score DESC, id DESC LIMIT 0, 1000я выбираю посты, упорядоченные по степени соответствия с первым.
первый из этой 1000 я считаю релевантным на 100% (как будто бы). Но я всеравно уточняю это соответствие с помощью php функции similar_text. Если > 90% совпадения, значит это дубликат (да, различия небольшие допускаются, это как раз то что мне нужно). Если нет, то беру следующий из этой 1000 (раньше при несовпадении по similar, я сразу останавливался и переходил к началу цикла (п1), но потом заметил, что идентичные посты могут быть вовсе даже не на первом месте (вот так вот, да, работает полнотекстовый поиск в mySQL, не совсем он предсказуем).
далее я беру следующие посты, пока вычисляемая релевантность относительно первого не упадёт до некоторого значения (score). и все их прогоняю со сравниваемым через similar_text. То, что > 90% отмечаю. Далее цикл повторяется до тех пор, пока все посты не будут проверены/размечены.
Проблема в том, что это довольно долго. Но без полнотекстового поиска match-against, одним similar - это еще дольше, даже и думать нечего, а без similar - можно нахватать совершенно левых дубликатов.
Может быть у кого то есть соображения, как улучшить сей алгоритм? Скорость этого моего алгоритма зависит от размера базы: при 500 000 записей (постов), обработка одного занимает десятки секунд.