после того, как я искал, я нашел, как делать нечеткий поиск по строке
но у меня есть массив строк
$search = {"a" => "laptop","b" => "screen" ....}
что я получил из DB MySQL
Есть ли какой-либо php-класс или функция, которая выполняет нечеткий поиск по массиву слов
или, по крайней мере, ссылку на, возможно, какую-то полезную информацию
я видел комментарий, который рекомендует использовать PostgreSQL
и это функция нечеткого поиска, но
у компании уже есть БД MySQL
Есть ли рекомендации?
Посмотрите на функцию Левенштейна
В основном это дает вам разницу (с точки зрения стоимости) между строками. Т.е. какова стоимость преобразования строки A в строку B.
Установите себе пороговое расстояние levenshein и что-нибудь под этим для двух слов означает, что они похожи.
Кроме того, алгоритм Bitap быстрее, поскольку он может быть реализован с помощью побитовых операторов, но я считаю, что вам придется реализовать его самостоятельно, если только там не существует PHP-lib.
РЕДАКТИРОВАТЬ Использовать метод левенштейна:
Строка поиска – «maptop», и вы устанавливаете «порог стоимости», чтобы сказать 2. Это означает, что вы хотите, чтобы любые слова, которые являются двумя операциями преобразования строк, удалены от вашей строки поиска.
поэтому вы прокручиваете массив «A» строк до тех пор, пока
levenshtein ( A[i] , searchString ) <= 2
Это будет ваш матч. Однако вы можете получить более одного слова, которое соответствует, так что вам решать, как вы хотите обрабатывать дополнительные результаты.
Вы можете сделать это в MySQL, поскольку у вас уже есть база данных MySQL. Как мне выполнить нечеткое совпадение имен компаний в MYSQL с PHP для автоматического заполнения? в котором упоминается реализация MySQL Double Metaphone и реализована в SQL for MySQL 5.0+
Изменить: извините, ответив здесь, поскольку есть больше, чем может помещаться в комментарии …
Поскольку вы уже приняли ответ, используя функцию PHP Levenshtein, я предлагаю вам сначала попробовать этот подход. Программное обеспечение является итеративным; поиск массива PHP может быть именно тем, что вы хотите, но вам нужно сначала протестировать и реализовать его в соответствии с вашими требованиями. Как я уже сказал в вашем другом вопросе, поиск по типу решения может быть самым простым решением здесь, что просто сужает продукт по типу пользователя. Возможно, нет необходимости реализовывать какой-либо нечеткий поиск, так как вы используете пользователя для выполнения самого нечеткого поиска 🙂
Например, пользователь начинает вводить S
, a
, m
что позволяет сузить продукты до тех, которые начинаются с Sam
. Таким образом, вы всегда позволяете пользователю выбрать продукт, который вы уже знаете, действительный.