2011-04-01 146 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)和删除面包车