нечеткий поиск в массиве в php - PullRequest
4 голосов
/ 01 августа 2011

после того, как я искал, я нашел, как сделать нечеткий поиск по строке

но у меня есть массив строк

$search = {"a" => "laptop","b" => "screen" ....}

что я извлек из БД MySQL

Есть ли какой-либо php-класс или функция, которая выполняет нечеткий поиск по массиву слов

или хотя бы ссылку с полезной информацией

Я видел комментарий, который рекомендует использовать PostgreSQL

и возможность нечеткого поиска, но

у компании уже была БД MySQL

Есть ли рекомендации?

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Вы могли бы сделать это в MySQL, поскольку у вас уже есть база данных MySQL - Как сделать нечеткое совпадение названий компаний в MYSQL с PHP для автозаполнения? , в котором упоминается реализация MySQL Double Metaphone и имеет реализацию в SQL для MySQL 5.0 +

Редактировать: Извините, что отвечаю здесь, поскольку в комментарии больше, чем могло бы уместиться & hellip;

Поскольку вы уже приняли ответ, используя PHP-функцию Левенштейна , тогда я предлагаю вам сначала попробовать этот подход. Программное обеспечение является итеративным; поиск в массиве PHP может быть именно тем, что вы хотите, но вы должны сначала протестировать и реализовать его в соответствии с вашими требованиями. Как я уже говорил в , ваш другой вопрос a найти при вводе решение может быть самым простым решением здесь, которое просто сужает продукт по мере ввода пользователем. Возможно, нет необходимости реализовывать какой-либо нечеткий поиск, поскольку вы используете User для самостоятельного нечеткого поиска: -)

Например, пользователь начинает вводить S, a, m, что позволяет сузить продуктов до тех, которые начинаются с Sam. Таким образом, вы всегда позволяете пользователю выбирать продукт, который, как вы уже знаете, действителен.

2 голосов
/ 01 августа 2011

Посмотрите на функцию Левенштейна

По сути, это дает вам разницу (в смысле стоимости) между строками.Т.е. какова стоимость преобразования строки A в строку B.

Установите себе пороговое расстояние левенштейна и что-нибудь под этим для двух слов означает, что они похожи.

Также BitapАлгоритм работает быстрее, поскольку он может быть реализован с помощью побитовых операторов, но я полагаю, что вам придется реализовать его самостоятельно, если где-то нет PHP-библиотеки для него.

РЕДАКТИРОВАТЬ Виспользуйте метод Левенштейна:

Строка поиска - "maptop", и вы устанавливаете свой "порог стоимости", чтобы сказать 2. Это означает, что вы хотите, чтобы любые слова, которые являются двумя операциями преобразования строки, были удалены от вашей строки поиска.

так что вы перебираете массив строк «A» до тех пор, пока

levenshtein ( A[i] , searchString ) <= 2

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

...