Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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
C# 有没有一种方法可以在SQL数据库中搜索相似的单词(表示不相同的单词)?_C#_Java_Php_Mysql - Fatal编程技术网

C# 有没有一种方法可以在SQL数据库中搜索相似的单词(表示不相同的单词)?

C# 有没有一种方法可以在SQL数据库中搜索相似的单词(表示不相同的单词)?,c#,java,php,mysql,C#,Java,Php,Mysql,有没有一种方法可以在MySQL数据库中搜索相似的单词(表示不相同的单词)。例如:用户在数据库中搜索单词“abcd”,而数据库中有一个单词“abd”,因此搜索引擎或程序会像在web上的大多数搜索引擎中一样询问用户“你是指[abd]?”?请注意,搜索词不是现有词的一部分(不能使用“like”)取决于它们之间的距离,您可以查看soundex 查看算法。它计算两个字符串之间的“距离”,并确定将一个字符串转换为另一个字符串所需的步骤。步数越少,两条弦就越近 本文展示了作为MySQL存储函数实现的算法 该算

有没有一种方法可以在MySQL数据库中搜索相似的单词(表示不相同的单词)。例如:用户在数据库中搜索单词“abcd”,而数据库中有一个单词“abd”,因此搜索引擎或程序会像在web上的大多数搜索引擎中一样询问用户“你是指[abd]?”?请注意,搜索词不是现有词的一部分(不能使用“like”)

取决于它们之间的距离,您可以查看soundex

查看算法。它计算两个字符串之间的“距离”,并确定将一个字符串转换为另一个字符串所需的步骤。步数越少,两条弦就越近

本文展示了作为MySQL存储函数实现的算法

该算法比LIKE或SOUNDEX好得多


我相信谷歌使用的是众包数据,而不是算法。ie如果用户键入abcd,单击“上一步”按钮,然后立即搜索abd,则会在两个搜索词之间建立关系,因为用户对结果不满意。一旦你有了一个非常大的社区搜索,那么模式就会出现。

另一种技术是在上面创建索引。

由于Dave Barker答案中的链接已失效,下面是以下代码:

CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
        DECLARE s1_char CHAR;
        DECLARE cv0, cv1 VARBINARY(256);
        SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
        IF s1 = s2 THEN
          RETURN 0;
        ELSEIF s1_len = 0 THEN
          RETURN s2_len;
        ELSEIF s2_len = 0 THEN
          RETURN s1_len;
        ELSE
          WHILE j <= s2_len DO
            SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
          END WHILE;
          WHILE i <= s1_len DO
            SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
            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;
                IF c > c_temp THEN SET c = c_temp; END IF;
                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
CREATE FUNCTION LEVENSHTEIN_RATIO (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, max_len INT;
        SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
        IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF;
        RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100);
      END