mysql文档 MATCH...AGAINST
在布尔模式中,表示类似“星号用作截断(或通配符)运算符。与其他操作符不同的是,它附加在要影响的词后面。如果单词以*运算符前面的单词开头,则匹配。“这意味着您只能将其用于匹配单词的开头。我希望能够尽可能高效地搜索,有时我搜索的单词是目标字符串中间的部分单词。我尽量避免在不需要的时候做全表扫描。
有没有办法把 MATCH...AGAINST
语法的备份 WHERE foo LIKE '%bar%
?
例如,我有下表(为了简洁起见省略了一堆字段):
CREATE TABLE `tours` (
`tourId` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`tourName` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`tourId`),
FULLTEXT KEY `ft_tourId_tourName` (`tourName`,`tourId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我希望能够在一个查询中同时搜索tourid和tourname,只有在绝对必要时才进行完整的表扫描。
有没有可能这样做,我把 MATCH...AGAINST
以及 LIKE
,而不进行全表扫描:
SELECT
*
FROM
tap.tourdetails
WHERE
MATCH(tourId, tourName) AGAINST('dc10*' IN BOOLEAN MODE)
OR tourId LIKE '%dc10%' OR tourName LIKE '%dc10%' ORDER BY tourName;
目前,尽管“dc10*”在 MATCH...AGAINST
. 我只想用 LIKE
(和所需的全表扫描)如果匹配失败。可能吗?替代解决方案?
1条答案
按热度按时间byqmnocz1#
假设你希望找到
xyzdc10
:MATCH
不归档xyzdc10
但是LIKEs
威尔。LIKE
使用前导通配符需要进行全表扫描。您正在使用
OR
.因此表扫描。
相反,如果你只想要以
dc10
,然后摆脱LIKEs
--那个MATCH
做所有的工作,而且做得很快。FULLTEXT
索引将列拆分为单词,并搜索单词。LIKE
没有;相反,它必须扫描每个字符串。无索引好处LIKE
使用初始通配符。