Сравните строковую функцию в mysql по словам - PullRequest
0 голосов
/ 28 октября 2011

Я пытаюсь создать функцию поиска в 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

Идея состоит в том, чтобы создать две временные таблицы для хранения каждого слова и затем сравнить эти 2 таблицы.Результат хороший, но производительность ужасная.У кого-нибудь есть идея получше, пожалуйста, дайте мне совет.Большое спасибо!

1 Ответ

0 голосов
/ 28 октября 2011

Я не думаю, что это будет работать, как указано.

Логика логична, но вы не присвоили никакой переменной result. Следовательно, эта функция всегда будет возвращать 0. Заменить:

RETURN result;

с

RETURN numberMatch;

Также замените:

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

С точки зрения эффективности это выглядит довольно эффективно. Когда вы говорите «производительность ужасна» - что значит «ужасно»? Есть ли у вас какие-либо контрольные цифры, например, х звонки заняли у миллис?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...