2009-12-16 3 views
5

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

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

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

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

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

ответ

7

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

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

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

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

3

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

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

Смежные вопросы