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