Я надеюсь реализовывать нечеткий поиск маленького приложения PHP/MySQL. А именно, у меня есть база данных приблизительно с 2 400 записями (записи, добавленные на уровне приблизительно 600 в год, таким образом, это - маленькая база данных). Эти три интересующих области являются конкретным адресом, фамилией и датой. Я хочу смочь искать одним из тех полей и по существу иметь допуск для написания/символа ошибок. т.е. адрес "Мэйн-Стрит, 123", должен также соответствовать "Main St, 123", "Main St, 123", "Mian St, 123", "Man St, 123", "Main St, 132", и т.д. и аналогично для имени и даты.
Основные вопросы я имею с ответами на другие подобные вопросы:
Какие-либо предложения? Я знаю, что не будет возможным сделать исходно с MySQL, но так как набор данных так ограничен, я хотел бы сохранить это относительно простым..., возможно, класс PHP, который получает все записи от DB, использует своего рода алгоритм сравнения и возвращает идентификаторы подобных записей?
Спасибо, Jason
Ответ Раззи (или используя Дамерау – Левенштейн ) ранжирует список подходящих кандидатов в соответствии с их близостью к ключу поиска. (Будьте осторожны: если ключ - «12 Main St», то «13 Main St» имеет такое же расстояние ввода, как «12 Moin St», но вы можете захотеть поставить его ниже или даже исключить его, как в случае с 11 и 22 Main St. и т. д.)
Но как выбрать список кандидатов управляемого размера для ранжирования?
Один из способов - вычислить значение метафона (или значения, используя двойной метафон) для каждого слова в строках, которые вы собираетесь искать. Сохраните каждый из этих метафонов в другой таблице с идентификатором строки, содержащей исходную строку. Затем вы можете быстро выполнить поиск по этим значениям метафона с помощью LIKE 'key%', где ключ - это метафон слова из поискового текста.
Ознакомьтесь с предлагаемым ответом в этой ветке . Это довольно удобно и должно хорошо работать для небольших БД.
Если это очень маленькая база данных, вы можете загрузить все данные сразу и использовать для поиска такой алгоритм, как Jaro-Winkler . У них есть реализация на PHP, которую вы можете найти здесь .
Имхо, она работает очень хорошо. Взгляните на пример реализации здесь . Я знаю, что в этом поиске используется тот же алгоритм, и он очень хорошо может найти "Nintedno". Он также сортирует результаты на основе того, какой результат лучше всего соответствует вашему запросу.