我是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可以贡献的任何模块都可用。
另一个问题是:我如何查找Just“John”或“Dow”?应显示其中包含“John”的每个名称。我尝试了“WHERE name LIKE”约翰“”,但这太慢了。有更快的方法吗?
感谢您提出任何建议。
答案 0 :(得分: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
)编入索引。
答案 1 :(得分:0)
解决问题的一种方法是为名称创建canonical form。所有类似名称的规范名称都是相同的。然后,当您想要找到John Doe或JohnDoé或其他任何内容时,您首先会生成规范名称,然后按此进行查找。
当然,如果你想让 Doe 和 Due 之类的东西相互对应,那么创建一个规范化人名的算法是非常困难的。一个简单的基本解决方案可以处理您提到的其他情况,即剥离所有重音(à - &gt; a)并删除 von , van 等。< / p>