一尘不染

MySQL全文搜索与部分单词

mysql

MySQL全文搜索似乎是一种很棒的方法,也是使用SQL进行搜索的最佳方法。但是,我似乎停留在以下事实:它不会搜索部分单词。例如,如果我有一篇标题为“
MySQL Tutorial”的文章并搜索“ MySQL”,它将找不到它。

完成一些搜索后,我发现MySQL 4中提供了各种支持该功能的参考(我使用的是5.1.40)。我曾尝试使用“ MySQL
”和“%MySQL%”,但均无效(我发现一个链接建议它是星号,但您只能在结尾处或开头都不能这样做)。

这是我的表结构和查询,如果有人可以告诉我我要去哪里,那将很棒。我假设以某种方式构建了部分单词匹配。

如果不存在`articles`,则创建表(
  `article_id` smallint(5)unsigned NOT NULL AUTO_INCREMENT,
  `article_name` varchar(64)NOT NULL,
  `article_desc`文字NOT NULL,
  `article_link` varchar(128)NOT NULL,
  `article_hits` int(11)NOT NULL,
  `article_user_hits` int(7)unsigned NOT NULL DEFAULT'0',
  `article_guest_hits` int(10)unsigned NOT NULL DEFAULT'0',
  `article_rating` decimal(4,2)NOT NULL DEFAULT'0.00',
  `article_site_id` smallint(5)unsigned NOT NULL DEFAULT'0',
  `article_time_added` int(10)unsigned NOT NULL,
  `article_discussion_id` smallint(5)unsigned NOT NULL DEFAULT'0',
  `article_source_type` varchar(12)NOT NULL,
  `article_source_value` varchar(12)NOT NULL,
  主键(`article_id`),
  全文键`article_name`(`article_name`,`article_desc`,`article_link`)
)ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 7;



插入“ articles”值
(1,'MySQL Tutorial','Lorem Ipsum只是印刷和排版行业的伪文本。Lorem Ipsum自1500年代以来一直是该行业的标准伪文本,当时一台未知的打印机拿起一个厨房的类型并将其拼凑成一本类型的标本,它不仅生存了五个世纪,而且在电子排版方面也获得了飞跃,基本上没有改变,在1960年代随着Letraset包含Lorem Ipsum段落的纸张的发行而流行,最近又在桌面排版软件(如Aldus PageMaker,包括Lorem Ipsum的版本。','http://www.domain.com/'、6、3、1、'1.50'、1、1269702050、1、'0'、'0'),
(2,“如何很好地使用MySQL”,“ Lorem Ipsum只是印刷和排版行业的伪文本。LoremIpsum自1500年代以来一直是该行业的标准伪文本,当时一台未知的打印机接管了一个厨房并进行了加扰。它不仅制作了样本样本,还存活了五个世纪之久,而且在电子排版方面也获得了飞跃,基本上没有改变,它在1960年代流行,发行了包含Lorem Ipsum段落的Letraset纸,最近又在台式机上发行了发布软件,例如Aldus PageMaker,包括Lorem Ipsum的版本。”,“ http://www.domain.com/”,1、2、0,“ 3.00”,1、1269702050、1,“ 0”,“ 0”) ,
(3,“优化MySQL”,“ Lorem Ipsum只是印刷和排版行业的伪文本。LoremIpsum自1500年代以来一直是该行业的标准伪文本,当时未知的打印机采用了一个厨房类型并将其打乱以制成一本类型的标本,它不仅生存了五个世纪,而且在电子排版方面也获得了飞跃,基本上没有改变,在1960年代随着Letraset包含Lorem Ipsum段落的纸张的发行而流行,最近又在桌面排版软件(如Aldus PageMaker,包括Lorem Ipsum的版本。','http://www.domain.com/'、0、1、0、'3.00'、1、1269702050、1、'0'、'0'),
(4,'1001 MySQL Tricks','Lorem Ipsum只是印刷和排版行业的伪文本。Lorem Ipsum自1500年代以来一直是该行业的标准伪文本,当时未知的打印机采用了厨房类型并将其打乱到制作样本书,它不仅生存了五个世纪,而且在电子排版方面也取得了飞跃,基本上没有改变,在1960年代随着Letraset纸页的发行(包含Lorem Ipsum段落)以及最近在桌面出版软件上的普及而流行。例如Aldus PageMaker,其中包括Lorem Ipsum的版本。”,“ http://www.domain.com/”,0、1、0,“ 3.00”,1、1269702050、1,“ 0”,“ 0”),
(5,“ MySQL vs. SQL”,“ Lorem Ipsum只是印刷和排版行业的伪文本。LoremIpsum自1500年代以来就是该行业的标准伪文本,当时未知的打印机采用了厨房类型并对其进行了打乱它不仅可以生存五个世纪,还可以实现电子排版的飞跃,基本上没有变化,它在1960年代得到了普及,发行了包含Lorem Ipsum段落的Letraset纸页,并且最近在桌面出版中发行了类似Aldus PageMaker的软件,包括Lorem Ipsum的版本。”,“ http://www.domain.com/”,0、2、0,“ 3.00”,1、1269702050、1,“ 0”,“ 0”),
(6,'MySQL Security','Lorem Ipsum只是印刷和排版行业的伪文本。Lorem Ipsum自1500年代以来一直是该行业的标准伪文本,当时未知的打印机采用了一个厨房类型并将其打乱以制成一本类型的标本,它不仅生存了五个世纪,而且在电子排版方面也获得了飞跃,基本上没有改变,在1960年代随着Letraset包含Lorem Ipsum段落的纸张的发行而流行,最近又在桌面排版软件(如','http://www.domain.com/',0,2,0,'3.00',1,1269702050,1,'0','0');



从文章中选择count(a.article_id)

            在哪里匹配(a.article_name,a.article_desc,a.article_link)再次('mysql')
            GROUP BY a.article_id
            按a.article_time_add ASC排序

使用前缀是因为它来自有时会添加其他联接的函数。

如您所见,对MySQL的搜索应返回6的计数,但不幸的是,它没有返回6。

更新资料

由于每一行都匹配,因此没有返回结果。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-
language.html

“搜索结果为空,因为至少有50%的行中包含单词“
MySQL”。因此,它被有效地视为停用词。对于大型数据集,这是最理想的行为:自然语言查询不应从1GB的表中每隔两行返回一次。对于较小的数据集,可能不太理想。”


阅读 256

收藏
2020-05-17

共1个答案

一尘不染

我的理解是MySQL FULLTEXT索引仅支持搜索前缀(MATCH (a.article_name) AGAINST ('MySQL*' IN BOOLEAN MODE))。

2020-05-17