2011-10-28 13 views
0

mysqlで検索機能を作成しようとしています。検索結果をより信頼できるものにするために、2つの文字列を単語で比較する必要があります。入力は2つの文字列であり、出力は数字の2つの文字列と一致します。 My SQLでは以下のようにしました。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つのテンポラリテーブルを作成し、それぞれの単語を保存し、次にこれらの2つのテーブルを比較します。結果は良いですが、パフォーマンスはひどいです。誰もが良いアイデアを持っている、私に助言を与えてください。 多くの感謝!

答えて

0

これは述べたようにはうまくいかないと思います。

ロジックは健全ですが、変数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 

でかなり効率的です。あなたは「パフォーマンスがひどい」と言うとき、何が「ひどい」ものなのでしょうか?例えばベンチマークの数字がありますか? xコールはyミリ秒かかりましたか?

+0

私の記事で間違って申し訳ありませんが、実際には、私がnumbermatchを返したと述べたように、この関数はうまくいきました。問題は、ベンチマークで2つの文字列を比較して、検索機能との組み合わせで約0.015秒かかったということでした。これはデータベースでわずか5kレコードで約5〜6秒かかりました。とにかく、あなたのコメントをありがとう。 –

関連する問題