MySQL中的全文搜索

时间:2011-04-01 12:01:14

标签: 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 `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”约翰“”,但这太慢了。有更快的方法吗?

感谢您提出任何建议。

2 个答案:

答案 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>