【问题标题】:MySQL full text query across multiple columns跨多列的 MySQL 全文查询
【发布时间】:2014-10-04 00:58:45
【问题描述】:

在 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”吗?

【问题讨论】:

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


    【解决方案1】:

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

    用双引号 (“"”) 字符括起来的短语匹配 仅包含按字面意思输入的短语的行。这 全文引擎将短语拆分为单词并执行搜索 单词的 FULLTEXT 索引。非单词字符不必是 完全匹配:短语搜索只需要匹配包含 与短语完全相同的单词并且顺序相同。为了 例如,“测试短语”匹配“测试,短语”。

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

    试着去掉双引号。

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

    【讨论】:

    • 感谢您的回答。当我删除双引号时,它会很快返回结果(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2010-11-10
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多