mysql部分单词匹配结合match…against和like作为备份

mitkmikd  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(471)

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 (和所需的全表扫描)如果匹配失败。可能吗?替代解决方案?

byqmnocz

byqmnocz1#

假设你希望找到 xyzdc10 : MATCH 不归档 xyzdc10 但是 LIKEs 威尔。 LIKE 使用前导通配符需要进行全表扫描。
您正在使用 OR .
因此表扫描。
相反,如果你只想要以 dc10 ,然后摆脱 LIKEs --那个 MATCH 做所有的工作,而且做得很快。 FULLTEXT 索引将列拆分为单词,并搜索单词。 LIKE 没有;相反,它必须扫描每个字符串。无索引好处 LIKE 使用初始通配符。

相关问题