Нечеткий поиск PHP / MySQL

Я ищу реализовать нечеткий поиск небольшого приложения PHP / MySQL. В частности, у меня есть база данных с около 2400 записей (записи добавляются со скоростью около 600 в год, поэтому это небольшая база данных). Три интересующих поля – это адрес улицы, фамилия и дата. Я хочу иметь возможность искать по одному из этих полей и, по существу, иметь толерантность к ошибкам орфографии / символа. т.е. адрес «123 Main Street» также должен соответствовать «123 Main St», «123 Main St.», «123 Mian St», «123 Man St», «132 Main St» и т. д., а также для имени и дата.

Основные вопросы, которые я имею с ответами на другие подобные вопросы:

  • Невозможно определить синонимы для каждого возможного неправильного написания, забудьте сделать это для дат и имен.
  • Lucene и т. Д. Кажется очень тяжелым для такого ограниченного набора данных поиска (назовите его не более 5000 записей, 3 поля на запись).
  • Просто делать что-то с помощью подстановочных знаков не представляется логичным со всеми возможными орфографическими ошибками.

Какие-либо предложения? Я знаю, что не может быть сделано изначально с MySQL, но поскольку набор данных настолько ограничен, я бы хотел сделать его относительно простым … возможно, класс PHP, который получает все записи из БД , использует какой-то алгоритм сравнения и возвращает идентификаторы похожих записей?

Спасибо, Джейсон

Solutions Collecting From Web of "Нечеткий поиск PHP / MySQL"

Ответ Рацци (или с использованием Дамерау-Левенштейна ) оценивает список матчей кандидатов в соответствии с их близостью к поисковому ключу. (Позаботьтесь: если клавиша «12 Main St», то «13 Main St» имеет такое же расстояние ввода, что и «12 Moin St», но вы можете захотеть ранжировать его на низком уровне или даже исключить его, как в 11 и 22 Main St и т.д.)

Но как вы выбираете список кандидатов управляемого размера для ранжирования?

Один из способов – вычислить значение метафона (или значения, используя двойной метафон) для каждого слова в строках, которые вы собираетесь искать. Сохраните каждый из этих метафонов в другой таблице с идентификатором строки, содержащей исходную строку. Затем вы можете быстро найти эти значения метафонов с помощью LIKE 'key%', где ключ является метафоном слова из текста поиска.

Ознакомьтесь с предлагаемым ответом на эту тему . Это довольно аккуратно и должно хорошо работать для DB, которые не огромны.

Если это очень маленькая база данных, вы можете сразу загрузить все данные и использовать для поиска такой алгоритм, как Jaro-Winkler . У них есть реализация на PHP, которую вы можете найти здесь .

Imho это работает очень хорошо. Взгляните на пример реализации здесь . Я знаю, что этот поиск использует тот же алгоритм, и он может найти «Nintedno» очень хорошо. Он также сортирует результаты для вас, основываясь на результатах, которые наилучшим образом соответствуют вашему запросу.