gpt4 book ai didi

MySQL跨多列全文查询

转载 作者:行者123 更新时间:2023-11-29 23:40:21 24 4
gpt4 key购买 nike

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

最佳答案

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

A phrase that is enclosed within double quote (“"”) characters matches only rows that contain the phrase literally, as it was typed. The full-text engine splits the phrase into words and performs a search in the FULLTEXT index for the words. Nonword characters need not be matched exactly: Phrase searching requires only that matches contain exactly the same words as the phrase and in the same order. For example, "test phrase" matches "test, phrase".

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

尝试去掉双引号。

尝试(“约翰和史密斯” bool 模式)并看看你会得到什么。它可能会起作用。此外,FULLTEXT 应该对两个单词匹配的记录进行排名,而不是只匹配一个单词的记录。

关于MySQL跨多列全文查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com