PHP/MySQL небольшой нечеткий поиск

Я надеюсь реализовывать нечеткий поиск маленького приложения PHP/MySQL. А именно, у меня есть база данных приблизительно с 2 400 записями (записи, добавленные на уровне приблизительно 600 в год, таким образом, это - маленькая база данных). Эти три интересующих области являются конкретным адресом, фамилией и датой. Я хочу смочь искать одним из тех полей и по существу иметь допуск для написания/символа ошибок. т.е. адрес "Мэйн-Стрит, 123", должен также соответствовать "Main St, 123", "Main St, 123", "Mian St, 123", "Man St, 123", "Main St, 132", и т.д. и аналогично для имени и даты.

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

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

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

Спасибо, Jason

5
задан Jason Antman 16 December 2009 в 13:30
поделиться

2 ответа

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

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

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

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

7
ответ дан 13 December 2019 в 22:09
поделиться

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

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

3
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: