我们在使用MySQL时,一般会用到两种引擎--MyISAM和InnoDB,MyISAM支持全文本搜索,但不支持事务处理;而InnoDB支持事务处理,但不支持全文本搜索。
一、有时,我们需要使用全文本搜索,例如:要搜索文本中存在指定的某个词,且以这个词出现的顺序排序。
先创建支持全文本搜索的表:
CREATE TABLE product_notes
(
note_id int NOT NULL AUTO_INCREMENT,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
) ENGINE=MyISAM;
注意:要使用全文本搜索,引擎一定要是MyISAM(ENGINE=MyISAM)。
在note_text字段定义了全文本搜索功能后,MySQL会自动为这列添加索引,并维护该索引。在增加,更新或删除行时,索引随之自动更新。
假设product_notes表中已经有了数据,现在我们来使用全文本查询:
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('rabbit');
这条语句检索出note_text字段包含rabbit的行。类似于:
SELECT note_text
FROM product_notes
WHERE note_text like '%rabbit%';
两者的区别在于使用like查询仅仅只返回包含‘rabbit’的行,而使用全文本会按'rabbit'在文本中出现的顺序排序,这是like所做不到的。例如(假设note_text字段存在下两列包含rabbit的行):
1:A fat rabbit
2:A rabbit
用全文本搜索出来就的排序就会这样
2:A rabbit
1:A fat rabbit
因为2中的rabbit前面只有一个词,而1中的有两个,所以2的优先级高,自然排在前面。
可以查看优先级
SELECT note_text
,Match(note_text) Against('rabbit') AS rank
FROM product_notes
返回:
note_text rank
1:A fat rabbit 1.6403435232543
2:A rabbit 1.5935389274914
3:A good day 0
4:To do it 0
二、使用查询扩展
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
返回:
2:A rabbit
1:A fat rabbit
3:A good day
因为3存在一个A,所以也被查询出来了。
三、布尔文本搜索
布尔操作符 描述
+ 包含指定值
- 排除指定值
> 包含指定值,并且增加优先级值
< 包含指定值,并且减少优先级值
() 把词组成表达式
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语
下面给出一些例子:
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('+rabbit +fat' IN BOOLEAN MODE);
返回:
2:A fat rabbit
文本包含rabbit和fat的行
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('rabbit -fat' IN BOOLEAN MODE);
返回:
2:A rabbit
排除文本中存在fat的行。
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('rabbit good' IN BOOLEAN MODE);
返回:
2:A rabbit
1:A fat rabbit
3:A good day
没有指定操作符,搜索包含rabbit或good的行。
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('"fat rabbit"' IN BOOLEAN MODE);
返回:
2:A fat rabbit
文本包含"fat rabbit"的行。
SELECT note_text
FROM product_notes
WHERE Match(note_text) Against('+fat +(>rabbit)' IN BOOLEAN MODE);
返回:
2:A fat rabbit
文本包含fat和rabbit的行,且减少后者的优先级值。
四、全文本搜索使用说明
1、指定值出现在行中的频率少于50%
2、忽略MySQL的内建非用词(stopword)
3、忽略单引号,如:fa't 搜索为fat
4、不具有词分隔符的语言(如:日语和汉语)不能恰当地返回全文本搜索结果
5、引擎必须是MyISAM类型
分享到:
相关推荐
与MySQL结合使用,Elasticsearch可以实现高效、复杂的全文搜索。MySQL是流行的关系型数据库管理系统,它存储结构化数据,而Elasticsearch则擅长处理非结构化的搜索需求。 在配置Elasticsearch进行全文搜索前,确保...
在MySQL中提高全文搜索效率是优化数据库性能的关键步骤,尤其是对于那些处理大量文本数据的应用程序。MySQL内置的全文搜索引擎提供了一种高效且智能的方法来执行全文搜索,这比传统的LIKE语句方法更具优势。 首先,...
MySQL作为广泛应用的关系型数据库,虽然内置的全文搜索功能在英文环境下表现出色,但在处理中文时则显得力不从心。这时,我们可以借助第三方工具如Sphinx来增强MySQL的全文检索能力,实现高效且精准的中文搜索。本文...
MySQL全文检索是一种高效的数据搜索机制,它允许用户执行类似搜索引擎的查询,显著提高了在大量文本数据中寻找特定信息的速度。全文检索在MySQL中主要应用于MyISAM存储引擎,因为MyISAM支持对大表的数据快速读取,...
MySQL全文搜索功能主要依赖于`MATCH()`和`AGAINST()`两个函数,用于在MyISAM表类型的字段上执行高效的文本搜索。以下是对标题和描述中所述知识点的详细说明: 1. **全文搜索的前提条件** - 表的存储引擎必须是...
本篇将聚焦于MySQL的全文模糊查找及其便捷解决方案,并结合PHP的Unicode工具类进行讨论。 MySQL的全文索引和搜索功能允许我们快速高效地执行复杂的模糊查找。全文索引不同于普通的索引,它能够理解自然语言,提供更...
### MySQL全文搜索技巧详解 #### 一、全文搜索概述 MySQL自版本3.23.23起开始支持全文索引和搜索功能。这一特性极大地增强了数据库查询的能力,特别是对于那些需要处理大量文本数据的应用场景而言。全文索引在...
3. **全文搜索**:如果“给定关键字不在字典中”是因为查询涉及的是文本字段,考虑使用全文搜索引擎如MySQL的Full-Text Search功能,或者更强大的解决方案如Elasticsearch。 4. **错误处理**:在应用程序中,应适当...
MySQL全文搜索是数据库管理系统MySQL中的一种高级特性,用于在大量文本数据中进行高效的数据检索。在MySQL 3.23.23版本之后,引入了全文索引(FULLTEXT),这是专门为MyISAM存储引擎设计的,以支持全文搜索功能。...
本篇文章将深入探讨MySQL的全文检索机制,以期帮助你构建高效的全文搜索引擎。 全文检索在信息检索领域扮演着关键角色,特别是在海量数据中查找相关信息时。MySQL的全文索引和搜索功能,始于版本5.6,进一步完善于...
3. **Full-text Search改进**:全文搜索引擎得到了升级,支持更多的查询操作,如全文本搜索、词语近似度搜索和查询优化。 4. **性能优化**:5.5版本增强了查询缓存,提升了查询执行效率,并引入了性能分析工具,如...
在数据库表中没有录入汉字对应的拼音首字母的情况下,进行汉字拼音首字母搜索,下载文本后 直接在mysql中执行,后就可实现根据拼音搜索功能
4. **Full-text Search增强**:此版本改进了全文搜索功能,支持部分索引和短语搜索,提高了搜索效率。 5. **分区功能**:MySQL 5.5加强了分区功能,允许用户对大型表进行更有效的管理,通过分区策略来提高查询速度...
本项目“ajax+mysql仿百度搜索智能提示功能”就是利用Ajax技术,结合MySQL数据库,实现了一个类似百度搜索的实时智能提示功能。下面将详细讲解其中涉及的关键知识点。 一、Ajax基础 Ajax的核心是JavaScript异步通信...
MySQL全文模糊搜索是一种高效的方法,用于在大量文本数据中寻找匹配特定关键词的记录。自MySQL 4.x版本开始,数据库系统引入了`MATCH ... AGAINST`语法,这为用户提供了一种方便的方式来执行全文检索,尤其是在...
本压缩包文件"mysql5.6版本.zip"包含的是MySQL 5.6的安装程序"mysql-installer-community-5.6.40.1.msi",这是一个社区版的安装程序,适用于个人学习和非商业用途。 MySQL 5.6版本的主要特性包括: 1. **性能提升*...