【发布时间】:2021-07-27 13:48:35
【问题描述】:
我正在尝试改进在非索引列上使用 like 运算符的查询。我四处寻找并提出全文搜索选项。
这里采取的步骤:
CREATE TABLE `test.my_stopwords`(value VARCHAR(30)) ENGINE = INNODB;
INSERT INTO `test.my_stopwords`(`value`) VALUES ('admin');
INSERT INTO `test.my_stopwords`(`value`) VALUES ('journalist');
CREATE TABLE `test.Users` (
`Id` varchar(26) NOT NULL,
`Roles` text,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
SET GLOBAL innodb_ft_server_stopword_table = 'test/my_stopwords';
CREATE FULLTEXT INDEX idx_users_role ON Users(Roles);
我正在尝试进行与此等效的全文搜索:
SELECT Id
FROM Users
WHERE Roles LIKE '%admin%' OR Roles LIKE '%journalist%';
想出了这个:
SELECT Id
FROM Users
WHERE MATCH(Roles) AGAINST('admin journalist' IN BOOLEAN MODE);
这里有一些可能的角色值
'master_member allow_news system_user tradersclub system_admin'
'system_user system_admin tradersclub journalist mover'
'allow_news master_member system_user system_admin'
'allow_news system_user system_admin'
'master_member allow_news system_user system_admin system_collab tradersclub'
'system_user system_admin editor_scoop'
'master_member system_user journalist tradersclub'
'allow_news master_member system_user system_admin'
'system_user system_admin'
'allow_news master_member system_user system_admin'
'allow_news master_member system_user system_admin'
'allow_news system_user system_admin master_member system_collab tradersclub'
'system_user system_admin editor_scoop'
'system_user master_member system_admin'
'system_user system_admin tradersclub'
'system_admin system_user master_member tradersclub allow_news allow_ideas'
'system_user journalist master_member system_admin system_collab tradersclub allow_ideas allow_news support moderator c_manager influencer'
第一个返回 128 行,第二个返回 19 行。我做错了什么?
【问题讨论】:
-
你能提供样本数据吗? %admin% 和 %journalist% 将找到部分文本。如果我没记错的话应该忽略停用词。
-
@PeterKoltai 为角色添加了可能的值
-
我认为完整的单词 'admin' 和 'journalist' 被排除在第二个查询之外,但当 'admin' 作为单词的一部分出现时,例如 'system_admin' 则不会。另一方面,第一个查询将为 %admin% 找到“system_admin”和“anythin_admin”
-
所以区别可能是第二个只在单词的一部分时找到“admin”和“journalist”,而在整个单词时不找到;第一个返回所有相似的东西。
-
但应该是等价的吧?为什么会发生这种行为?
标签: mysql