2012-11-30 105 views
1

目前我們有一個網站存儲用戶添加的文本作爲類型mediumtext。MySQL - 比較兩個字段並以百分比形式返回匹配

目前我們的系統正在檢查匹配的文本,並且當它是1:1(100%相同 - 一個空格並且將被視爲新文本)時返回true(是匹配)。

我們正在努力使系統更加智能化。必須能夠以百分比的方式告訴我們內容的相同程度(百分比)。不幸的是,我們沒有很好的進展。幾乎所有我們能夠想到的算法都無法正常工作,或者非常緩慢和沉重。

我們希望有人能夠給我們一個提升。

注:我們試圖做一個字節比較,但事情沒有正常工作。

編輯:我們不僅限於MySQL。我們正在尋找apache solr服務器。如果它有優勢,請在這個方向上給予幫助,如果有的話可以更好。

+0

有你看着(http://dev.mysql.com/doc/refman/5.5/en [全文檢索?] //fulltext-search.html) – Kermit

+0

是的,但並不滿意。你有一些想法來匹配百分​​比的內容嗎? – kanevbgbe

回答

0

您需要計算Levenshtein距離。

http://en.wikipedia.org/wiki/Levenshtein_distance

例如在SO: MySQL Levenshtein

DELIMITER $$ 

CREATE FUNCTION LEVENSHTEIN(s1 CHAR(255), s2 CHAR(255)) 
RETURNS int(3) 
DETERMINISTIC 
BEGIN 
    DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; 
    DECLARE s1_char CHAR(255); 
    DECLARE cv0, cv1 CHAR(255); 

    SET s1_len = LENGTH(s1); 
    SET s2_len = LENGTH(s2); 
    SET cv1 = 0x00; 
    SET j = 1; 
    SET i = 1; 
    SET c = 0; 

    IF s1 = s2 THEN 
     RETURN 0; 
    ELSE IF s1_len = 0 THEN 
     RETURN s2_len; 
    ELSE IF s2_len = 0 THEN 
     RETURN s1_len; 
    ELSE 
     WHILE j <= s2_len DO 
      SET c = c + 1; 
      IF s1_char = SUBSTRING(s2, j, 1) THEN 
      SET cost = 0; ELSE SET cost = 1; 
      END IF; 
      SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; 
       SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; 
       IF c > c_temp THEN 
        SET c = c_temp; 
       END IF; 
       SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; 
      END WHILE; 
      SET cv1 = cv0, i = i + 1; 
     END WHILE; 
    END IF; 
    RETURN c; 
END$$ 

DELIMITER ; 
+0

你好。你可以給我更多的幫助,因爲mysql正在返回錯誤: 正確的語法使用'WHILE; END IF; RETURN c; END 36' – kanevbgbe

+0

抱歉,不是我的代碼。你可以谷歌的其他MySQL實現。我的回答只是讓你走上正確的軌道,而不是提供完整的解決方案。 – kcsoft

+0

我修復了它,它對於我們所需要的目的非常非常慢。結果:顯示第10 - 9行(總計10個,查詢花費232.2726秒) – kanevbgbe

相關問題