MySQL中的全文搜索
我不熟悉MySQL中的“搜索”,我有一些任务,我不知道如何以最佳方式实现它们 我的数据库中有以下MySQL表MySQL中的全文搜索,mysql,performance,search,entity,similarity,Mysql,Performance,Search,Entity,Similarity,我不熟悉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
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”。应在此表中的“名称”列中查找此名称。我希望查询返回所有类似的名称,如“johndue”或“johndoé”等等。因此,用户可以从列表中选择正确的名称。有时人们想查一个像“约翰·凡多伊”(荷兰风格)这样的名字。这也应该显示在列表中
如何最好地实现这一点?或者我最好问一下。这可能吗?=)顺便说一下,我使用的是python cgi脚本,因此python可以提供的任何模块都是可用的
另一个问题是:如何查找“John”或“Dow”?应显示每一个有“约翰”字样的姓名。我试着用“约翰”这样的名字,但这太慢了。有没有更快的办法
谢谢您的建议。解决此问题的一种方法是为名称创建一个。所有相似名称的规范名称都是相同的。然后,当您想要查找John Doe或John Doé或其他任何东西时,您首先要生成规范名称,然后根据该名称进行查找 当然,创建一个规范化人名的算法是非常困难的,如果您想让Doe和Due这样的东西相互对应的话。一个简单的基本解决方案是去掉所有的重音(A->A),去掉von,van等 任务是:在html表单中,我想输入一个名称,比如“John Doe”。应在此表中的“名称”列中查找此名称。我希望查询返回所有类似的名称,如“johndue”或“johndoé”等等。因此,用户可以从列表中选择正确的名称。有时人们想查一个像“约翰·凡多伊”(荷兰风格)这样的名字。这也应该显示在列表中
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\u GENERAL\u CI
如果只想查找John
,请使用以下查询:
SELECT *
FROM authors
WHERE MATCH(name) AGAINST ('+john' IN BOOLEAN MODE)
另外,请确保在my.cnf
中将参数ft\u min\u word\u len
设置为合理的值(1
最好)
默认值为
4
,这意味着不会为三个字母的姓氏(如Doe
)编制索引。我个人认为您应该稍微研究一下数据库规范化。非常感谢!你回答的最后一部分对我帮助很大!