跨多个列的MySQL全文查询

时间:2014-10-04 00:58:45

标签: mysql full-text-search full-text-indexing fulltext-index

我有一个问题,我在MySQL中使用全文搜索时感到困惑。我正在运行MySQL 5.1.67。这是我的简化表:

CREATE TABLE `contact_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(25) DEFAULT NULL,
`last_name` varchar(35) DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `idx_ft_first_name_last_name` (`first_name`,`last_name`)
) ENGINE=MyISAM CHARSET=latin1;

我想在一个包含大约500万行的表中查询名字和姓氏。名字和姓氏在不同的列中,如上表所示。我想获得名字和名字是#34; John Smith"的所有行。我不希望所有以约翰为名的人或史密斯作为他们的姓。我知道我可以执行以下操作,但因为用户有时选择将全名存储在first_name列或last_name列中,所以我尝试设置全文搜索。

SELECT ci.first_name,ci.last_name FROM contact_info ci
WHERE  ci.first_name LIKE 'John%' AND ci.last_name LIKE 'Smith%' 

当我运行查询强制它使用主键索引时,它会为John Smith返回几百条记录,这是我想要的但它很慢并且需要大约5秒。这是查询:

SELECT ci.first_name,ci.last_name FROM contact_info ci USE INDEX(PRIMARY)
WHERE MATCH(ci.first_name,ci.last_name) AGAINST ('"John Smith"' IN BOOLEAN MODE);

当我使用优化程序更喜欢的索引运行查询时,它不会返回任何内容。

SELECT ci.first_name,ci.last_name FROM contact_info ci USE INDEX(idx_ft_first_name_last_name)
WHERE MATCH(ci.first_name,ci.last_name) AGAINST ('"John Smith"' IN BOOLEAN MODE);

为什么它没有返回任何东西?是否无法查询" John Smith"在两列中使用像这样的全文索引?

1 个答案:

答案 0 :(得分:0)

FULLTEXT搜索的文档说明了这一点:

  

包含在双引号(“”“)字符内的短语匹配   仅键入包含短语字面的行。该   全文引擎将短语拆分为单词并执行搜索   单词的FULLTEXT索引。非字符不一定是   完全匹配:短语搜索只需要匹配包含   与短语完全相同的单词和相同的顺序。对于   例如,“测试短语”匹配“测试,短语”。

您已将短语"John Smith"放入双引号中。但是,您没有任何包含该短语的列:它跨列分割。

尝试不使用双引号。

尝试('John AND Smith'在BOOLEAN模式中),看看你得到了什么。它可能会奏效。此外,FULLTEXT应该将两个单词匹配的记录排在高于只有一个匹配的记录的位置。