可以soundex在mysql的列的一部分上使用?

Dmi*_*try 3 php mysql

是否可以使用soundex比较列的部分与搜索词?例如,如果用户搜索"五十三" - 它将找到"Nirve Sports五十三金色金属巡洋舰".我尝试将soundex与locate函数结合使用但出错了.这是我的PHP代码:

$soundex = soundex($keyword);
$soundexPrefix = substr($soundex, 0, 2); 
$sql = "SELECT name ".
"FROM products WHERE SOUNDEX(LOCATE('$keyword', name)) LIKE '%$soundexPrefix%'";
Run Code Online (Sandbox Code Playgroud)

msi*_*man 9

你需要分解每个单词并进行SOUNDEX比较,这正是我要告诉你的这个功能的确如此.

使用该功能

用法示例: SELECT p.name FROM products p WHERE soundex_match('fiftythree', p.name, ' ')

它需要3个参数:

  • 针:你要找的那个词
  • haysack:你正在搜索的一串词
  • splitChar:将字符串分成单个单词的空白字符.一般来说就是空间('')

如果haystack中的任何单词听起来与针相似,则该函数将返回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 ;
Run Code Online (Sandbox Code Playgroud)

http://www.imranulhoque.com/mysql/mysql-function-soundex-match-multi-word-string/