2011-03-31 41 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