我有一个网站,我索引有关电影的信息。要查找电影,用户可以输入电影的标题,此查询将发送到数据库:

SELECT IMDB, Name, Year, Views
FROM Movies
WHERE Name LIKE '%$search%'

我用“相似的文本”功能来解决一些小错误。例如,如果名字是“Pulp Fiction”,用户键入:“Pulp Foction”,因为我没有得到任何结果,所以我为每部电影运行这个小代码。
            similar_text($search, $Name, $percent);

            if ($percent > $ValMax) {
                $ValMax = $percent;
                $PosMax = $i;
            }

我使用这段代码是因为我的数据库里只有几百部电影,将来最多也就两万部。同样,每部电影的片名平均为20个字符,不考虑Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb
真正的问题开始于用户使用的一个查询:“Capitan America”(意大利语是“Capitan America”,意思是“Captain America”,电影的名字是“Captain America–Il primo vendicatore”
使用Levenshtein函数,我得到了可怕的结果,使用类似的文本,它们至少是体面的。您可以看到查询here的完整结果。我编造了这个页面来查看每次搜索的levenshtein和类似的_文本是什么。
如果我不把百分之六十的障碍物放在这里的话,这部电影就会被选为“美国的乌纳沃尔塔时代”(在美国曾是如此)。
然而“美国司令部”和“美国司令部”是非常相似的,所以我想知道是否有办法检查每个单词。我也听说过Lucene,但我不知道如何开始,以及它是否适合我的需要。
谢谢:)

最佳答案

一:
您可以使用SOUNDS LIKE(可用作MySQL string function):

SELECT IMDB, Name, Year, Views FROM Movies WHERE Name SOUNDS LIKE '%$search%'

您可能希望在大型表上对其性能进行基准测试,因为'%$search%'中前面的通配符意味着您的语句将无法使用任何索引。
二:
另一个可能的解决方案是为MySQL创建一个自定义的levenshtein函数。Here,您可以找到一个示例:
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;
    -- max strlen=255
    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;

关于php - 重定向拼写错误的搜索php,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20265095/

10-09 22:50