0

在 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 万行的表中查询名字和姓氏。如上表所示,名字和姓氏位于不同的列中。我想获取名字和姓氏都是“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”?

4

1 回答 1

0

FULLTEXT 搜索的文档是这样说的:

包含在双引号 (“"”) 字符中的短语仅匹配包含按字面意思输入的短语的行。全文引擎将短语拆分为单词并在 FULLTEXT 索引中搜索单词。非单词字符不需要完全匹配:短语搜索只需要匹配包含与短语完全相同的单词并且顺序相同。例如,“test phrase”匹配“test,phrase”。

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

尝试去掉双引号。

试试(布尔模式下的“John AND Smith”),看看你会得到什么。它可能会起作用。此外,FULLTEXT 应该将两个单词匹配的记录排名高于仅匹配一个单词的记录。

于 2014-10-04T01:06:44.770 回答