Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用单词比较mysql中的字符串函数_Mysql_Search - Fatal编程技术网

用单词比较mysql中的字符串函数

用单词比较mysql中的字符串函数,mysql,search,Mysql,Search,我正在尝试在mysql中创建一个搜索函数。为了使搜索结果更可靠,我需要逐字比较两个字符串。输入为2个字符串,输出为两个字符串匹配的数字字。在MySql中,我做了如下操作 CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double BEGIN DECLARE cur_position INT DEFAULT 1 ; DECLARE r

我正在尝试在mysql中创建一个搜索函数。为了使搜索结果更可靠,我需要逐字比较两个字符串。输入为2个字符串,输出为两个字符串匹配的数字字。在MySql中,我做了如下操作

CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double
BEGIN
DECLARE cur_position INT DEFAULT 1 ; 
DECLARE remainder TEXT;
DECLARE cur_string VARCHAR(50);
DECLARE delimiter_length TINYINT UNSIGNED;
DECLARE numberMatch INT;
DECLARE total INT;
DECLARE result DOUBLE DEFAULT 0;
DECLARE delim VARCHAR(10);
DECLARE string2 VARCHAR(255);
SET delim = ' ';

DROP TEMPORARY TABLE IF EXISTS SplitString1;
CREATE TEMPORARY TABLE SplitString1 (
    SplitString1ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    val VARCHAR(50) NOT NULL
) ENGINE=MyISAM;
DROP TEMPORARY TABLE IF EXISTS SplitString2;
CREATE TEMPORARY TABLE SplitString2 (
    SplitString1ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,
    val VARCHAR(50) NOT NULL
) ENGINE=MyISAM;

SET remainder = str1;
SET delimiter_length = CHAR_LENGTH(delim);

WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
    SET cur_position = INSTR(remainder, delim);
    IF cur_position = 0 THEN
        SET cur_string = remainder;

    ELSE
        SET cur_string = LEFT(remainder, cur_position - 1);
    END IF;
    IF TRIM(cur_string) != '' THEN
        INSERT INTO SplitString1(val) VALUES (cur_string);
    END IF;
    SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
SET remainder = str2;
SET cur_position = 1;
WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
    SET cur_position = INSTR(remainder, delim);
    IF cur_position = 0 THEN
        SET cur_string = remainder;

    ELSE
        SET cur_string = LEFT(remainder, cur_position - 1);
    END IF;
    IF TRIM(cur_string) != '' THEN
        INSERT INTO SplitString2(val) VALUES (cur_string);
    END IF;
    SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
SELECT count(*) INTO numberMatch 
FROM SplitString1 s1 JOIN SplitString2 s2 ON s1.val = s2.val;
RETURN result;
END
其思想是创建两个临时表来存储每个单词,然后比较这两个表。结果不错,但表现很糟糕。谁有更好的主意,请给我一个建议。
非常感谢

我认为这不会像上面所说的那样起作用

逻辑是合理的,但您尚未为
结果
变量指定任何值。因此,此函数将始终返回0。替换:

RETURN result;

还应替换:

CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double


就效率而言,它看起来相当高效。当你说“表现糟糕”时,什么构成“糟糕”?您是否有任何基准数据,例如x调用占用y毫秒?

很抱歉我的帖子中出现错误,但事实上,正如您提到的,我返回了numbermatch,并且我确信该函数运行良好。问题是,在基准测试中比较两个字符串大约需要0.015秒,结合搜索功能,在数据库中只有5k条记录的情况下,大约需要5-6秒。无论如何,谢谢你的评论。
CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double
CREATE DEFINER=`root`@`localhost` FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255)) RETURNS double READS SQL DATA