PHP / MySQL мелкий нечеткий поиск - PullRequest
5 голосов
/ 16 декабря 2009

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

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

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

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

Спасибо, Jason

Ответы [ 2 ]

7 голосов
/ 18 декабря 2009

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

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

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

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

3 голосов
/ 16 декабря 2009

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

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

...