gpt4 book ai didi

结合 MATCH...AGAINST 和 LIKE 作为备份的 MySQL 部分单词匹配

转载 作者:行者123 更新时间:2023-11-30 21:38:34 27 4
gpt4 key购买 nike

bool 模式下 MATCH...AGAINST 的 MySQL 文档说了类似“星号用作截断(或通配符)运算符。与其他运算符不同,它附加到单词受到影响。如果单词以 * 运算符之前的单词开头,则单词匹配。”这意味着你只能用它来匹配单词的开头。我希望能够尽可能高效地搜索,有时我要搜索的词是目标字符串中间的部分词。我尽量避免在不需要时进行全表扫描。

有没有办法将 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...AGAINSTLIKE 结合在一起,而不进行全表扫描:

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 中实际匹配,上面的代码也会进行全表扫描。如果 MATCH 失败,我只想使用 LIKE (并且需要全表扫描)。可能的?替代解决方案?

最佳答案

假设您希望找到 xyzdc10:

  • MATCH 不会归档 xyzdc10LIKEs 会。
  • LIKE 带有前导通配符需要全表扫描。
  • 您正在使用OR

因此进行表扫描。

相反,如果您只想要 dc10 开头的词,则去掉LIKEs -- MATCH 完成所有工作,而且速度很快。

FULLTEXT 索引将列分解为单词,并搜索单词。 LIKE 没有;相反,它必须扫描每个字符串。初始通配符对 LIKE 没有任何索引好处。

关于结合 MATCH...AGAINST 和 LIKE 作为备份的 MySQL 部分单词匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52777936/

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