当前位置: 首页 > 面试题库 >

MySQL全文搜索与部分单词

邹祺然
2023-03-14
问题内容

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的表中每隔两行返回一次。对于较小的数据集,可能不太理想。”


问题答案:

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



 类似资料:
  • 带有Mongoose的MongoDB(3.2.0) 收藏: 用户 null 查询: =>找到 =>找到(搜索大小写敏感为false) =>找到(使用diacriticSensitive搜索为false) =>找到(部分搜索) =>未找到(部分搜索) =>未找到(部分搜索) 你知道为什么我用查询“Leo”或“L”得到0个结果吗? null

  • 问题内容: 我想在我的网页中进行全文搜索。我需要分页进行搜索。我的数据库每张表有50,000+行。我已经改变了我的表,并使其成为索引。该表始终处于更新状态,仍然有一个自动增加的列。而最新的总是在表格的末尾。 但整个查询时间将花费。我通过Google搜索了许多文章,有的文章写道,只有限制字段字长才能帮助更快地进行搜索。但作为一种类型,它会像这样改变一定的长度(我尝试过标题TEXT(500) CHAR

  • 问题内容: 这是我测试过的。 这是create语句。 等号和“赞”效果很好。所以为什么? 问题答案: 全文搜索需要多种多样的方式来消除重复的“噪音”。用最少的数据进行测试将产生较差的结果。将您的整个收藏集投入其中,以获取有意义的内容。如以下某些链接所示,甚至可以尝试搜索最小字数的设置。 停用词 有各种语言的停用词 MySql 列表,这些词表示在搜索过程中忽略的无关紧要的词。该列表已编译到服务器中,

  • 问题内容: 我正在将所有站点代码从使用mysql_ *函数转换为PDO。对于我的需求,PDO上的PHP文档尚不清楚。它为您提供了要使用的功能,但没有详细介绍它们在不同情况下的功能。 基本上,我有一个mysql全文搜索: 实际的语句要长得多,但这基本上就是它的作用。 我的问题是,如何将其纳入PDO? 我知道您不是要在位置标记周围使用引号,那么您是否将它们放在AGAINST()函数中?我包括他们吗?如

  • 问题内容: 我目前有一个搜索字段,使用此代码针对多个列进行搜索: 可以说我在表中有这两行: 如果我键入“ John S”,则仅第一个结果显示哪个是所需的行为。 如果我键入“ John Smith”,则仅第一个结果显示哪个是所需的行为。 如果我键入“ Smith J”,即使Bob不匹配,这两个结果也会显示。 如果我输入“ Smith John”,即使Bob不匹配,这两个结果也会显示。 最后,如果我键

  • 回顾 在前面的章节(分页),我们已经加强了数据库查询,因此能够在页面上获取各种查询。 今天,我们会继续探讨数据库的话题,只是领域不同。所有存储内容的应用程序必须提供搜索能力。 许多其它类型的网站可能使用了谷歌、必应等索引所有的内容并且提供查询结果。这个对于大多数静态页面的网站,像论坛,是很好用。我们应用程序 microblog 的基本单元是用户短小的 blog,不是整个页面。我们希望搜索结果是动态