2011-04-01 144 views
2

我是新來的「搜索」MySQL中,我有一些任務,我不知道如何實現他們的最佳方式。全文搜索MySQL

我在我的數據庫中有以下的MySQL表。

delimiter $$ 

CREATE TABLE `authors` (
    `id` int(11) NOT NULL, 
    `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    `count` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name_UNIQUE` (`name`), 
    FULLTEXT KEY `name_fulltext` (`name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$ 

任務是:在html表單中,我想輸入一個名稱,讓我們說「John Doe」。這個名字應該在這個表中的名字列中查找。我希望查詢返回所有類似的名稱,如「John Due」或「JohnDoé」等。所以用戶可以從列表中選擇正確的名稱。有時人們想要查找一個像「John van Doe」(荷蘭風格)這樣的名字。這應該也顯示在列表中。

這最好的實現方式是什麼?或者我應該更好地問。這可能嗎? =)我正在使用python cgi-script,所以任何模塊python都可以提供。

另一個問題是:我如何查找只是「John」或「Dow」?應顯示每一個有「約翰」的名字。我嘗試了「在哪裏名字像」約翰「」但這太慢了。有更快的方法嗎?

謝謝你的任何建議。

+0

我個人認爲你應該考慮一點數據庫規範化。 – 2011-04-01 12:06:20

回答

1

的任務是:在html表單我想輸入一個名字,讓我們說「John Doe」。這個名字應該在這個表中的名字列中查找。我希望查詢返回所有類似的名稱,如「John Due」或「JohnDoé」等。所以用戶可以從列表中選擇正確的名稱。有時人們想要查找一個像「John van Doe」(荷蘭風格)這樣的名字。這應該也顯示在列表中。

MySQL不支持同義詞詞典,所以你應該自己提供一個。

Yahoo API提供的信息可以通過提交查詢類似這樣使用拼寫校正服務:

SELECT * 
FROM search.spelling 
WHERE query='juhn doe' 

使用此URL

http://query.yahooapis.com/v1/public/yql?q=SELECT%20%20*%20%20FROM%20search.spelling%20WHERE%20query%20%3D%20'juhn%20doe'&format=json&diagnostics=true&callback=cbfunc 

只要你收到的同義詞列表,你可以使用這個查詢來搜索它們到MySQL

SELECT * 
FROM authors 
WHERE MATCH(name) AGAINST ('(+juhn +doe) (+john +doe)' IN BOOLEAN MODE) 

John Doé將由此返回,因爲您正在使用UTF8_GENERAL_CI這是不區分大小寫和不區分變音的。

如果你想只找John,使用此查詢:

SELECT * 
FROM authors 
WHERE MATCH(name) AGAINST ('+john' IN BOOLEAN MODE) 

此外,請確保您有參數ft_min_word_len集到一個合理的值(1最好)在my.cnf

默認爲4這意味着沒有三個字母的姓氏(如Doe)將被索引。

+0

非常感謝!你的迴應的最後一部分幫了我很多! – Aufwind 2011-04-01 15:40:57

0

解決此問題的一種方法是爲名稱創建canonical form。所有相似名稱的規範名稱都是相同的。然後,當你想找到John Doe或者John Doe或者其他什麼的時候,你首先要生成規範的名字,然後通過它進行查找。

當然,創造一個算法,規範化的人的名字是非常困難的,如果你想要得到的東西像李四由於以相互對應。將採取你所提到的其他情況下照顧一個簡單的基礎的解決辦法是去除所有的口音(A - > a)和刪除麪包車