Можно ли использовать soundex для сравнения части столбца с поисковым термином? Например, если пользователь ищет «fiftythree» – он найдет «Nirve Sports Fifty-Three Cruiser в Gold Metallic». Я попробовал комбинировать soundex с функцией locate, но получил ошибку. Вот мой php-код:
$soundex = soundex($keyword); $soundexPrefix = substr($soundex, 0, 2); $sql = "SELECT name ". "FROM products WHERE SOUNDEX(LOCATE('$keyword', name)) LIKE '%$soundexPrefix%'";
Вам нужно разбить каждое слово и выполнить сравнение SOUNDEX
, и именно эта функция я вам расскажу.
Пример использования: SELECT p.name FROM products p WHERE soundex_match('fiftythree', p.name, ' ')
Требуется 3 аргумента:
Если любое слово в стоге сена похоже на иглу, функция вернет 1 и 0 в противном случае.
Поэтому зайдите в свою базу данных (phpMyAdmin или в командной строке) и выполните это, вам нужно сделать это только один раз):
drop function if exists soundex_match; delimiter $$ create function soundex_match (needle varchar(128), haystack text, splitChar varchar(1)) returns tinyint deterministic begin declare spacePos int; declare searchLen int default length(haystack); declare curWord varchar(128) default ''; declare tempStr text default haystack; declare tmp text default ''; declare soundx1 varchar(64) default soundex(needle); declare soundx2 varchar(64) default ''; set spacePos = locate(splitChar, tempStr); while searchLen > 0 do if spacePos = 0 then set tmp = tempStr; select soundex(tmp) into soundx2; if soundx1 = soundx2 then return 1; else return 0; end if; end if; if spacePos != 0 then set tmp = substr(tempStr, 1, spacePos-1); set soundx2 = soundex(tmp); if soundx1 = soundx2 then return 1; end if; set tempStr = substr(tempStr, spacePos+1); set searchLen = length(tempStr); end if; set spacePos = locate(splitChar, tempStr); end while; return 0; end $$ delimiter ;
http://www.imranulhoque.com/mysql/mysql-function-soundex-match-multi-word-string/