2011-03-31 154 views
4

我正在帮朋友为他正在开发的一个项目建立一个字典。该项目的一部分是创建一个搜索功能。数据库在MySQL中,后端在php中。现在MySQL一个真正的LIKE语句

,运行我们的简单查询是小菜一碟:

SELECT *, 
    (
     (CASE WHEN word LIKE '%$query%' THEN 1 ELSE 0 END) + 
     (CASE WHEN defin LIKE '%$query%' THEN 1 ELSE 0 END) 
    ) AS relev 
    FROM dictionary 
    WHERE word LIKE '%$q%' 
    OR defin LIKE '%$q%' 
    ORDER BY relev DESC; 

它产生了良好的效果;例如,输入“火”给了我们火,消防员,救火车,着火等。但是,我们也想要错误的余地:我们想要“prnk”的错误给我们恶作剧,prink和粉红色,或者“骡子“也建议”鼹鼠“一词。

非常令人惊讶的是,我们无法找到任何信息。相关系统完全是肤浅的,因为我们不需要实际的相关性(只是一个总体指针),但我们确实需要一些东西(这就是为什么我们要去LIKE语句而不是MATCH ... AGAINST语句,我们在那里找不到按照相关性排序)。

数据库只包含三件事:id,word,defin。简单,因为这是所需的复杂性(或简单)。

感谢任何人提前。

+1

看看SOUNDEX函数 - http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex不是我用过的东西,但它可能是你的通过 – 2011-03-31 23:13:27

+0

这通常与拼写检查完成后,PHP使用手册 – 2011-03-31 23:15:36

+0

中记录的pspell \ enchant bot也是真的应该使用全文搜索http://dev.mysql.com/doc/refman/5.0/en/fulltext- search.html – 2011-03-31 23:16:35

回答

4

尝试测试如果单词听起来像一个在字典中,这样的东西沿线作者:

SELECT *, 
    (
     (CASE WHEN word LIKE '%$query%' THEN 1 ELSE 0 END) + 
     (CASE WHEN defin LIKE '%$query%' THEN 1 ELSE 0 END) + 
     (CASE WHEN LEFT(SOUNDEX(word), 4) = LEFT(SOUNDEX('$query'), 4) THEN 1 ELSE 0 END) + 
     (CASE WHEN LEFT(SOUNDEX(defin), 4) = LEFT(SOUNDEX('$query'), 4) THEN 1 ELSE 0 END) 
    ) AS relev 
    FROM dictionary 
    WHERE word LIKE '%$q%' 
    OR defin LIKE '%$q%' 
    ORDER BY relev DESC; 
+0

谢谢!这很好,只是在SOUNDEX功能中增加了两个条件,Mule现在也选择了Mole。 – Zirak 2011-04-02 12:53:15

4

关于恶作剧...

http://webarto.com/80/did-you-mean-api

$q = "prnk" 

$dym = new DYM; 
$spell = $dym->check($q); 
if(!empty($spell)){ 
    echo $spell; // prank 
} 

(不是真的API,没有真正可靠的,但它的工作,在不到0.5秒)

对于骡子/摩尔份尝试寻找莱文斯坦实施SQL ...

http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#552(链接不工作但谷歌它)

http://php.net/manual/en/function.levenshtein.php

+0

如果我可以选择两个答案,我也会选择你的;但不幸的是我不能。 :( – Zirak 2011-04-02 12:54:03

+0

@Zirak谢谢:) – 2011-05-12 03:26:13