MySQL 保姆级教程(十六):全文本搜索

第 18 章 全文本搜索

18.1 理解全文本搜索

在使用全文本搜索时,MySQL 不需要分别查看每个行,不需要分别分析和处理每个词
​
事务支持:
    InnoDB: 提供事务支持,支持事务的原子性、一致性、隔离性和持久性(ACID 属性)。
    MyISAM: 不支持事务,因此在出现故障或错误时,可能导致数据不一致。
并发性:
    InnoDB: 支持高并发性,具有行级锁定能力,多个事务可以同时处理不同的行。
    MyISAM: 具有表级锁定能力,因此在高并发环境下可能会导致性能瓶颈,一个事务对表的写操作可能会阻塞其他事务。
崩溃恢复:
    InnoDB: 具有崩溃恢复的能力,能够在数据库重新启动后自动进行恢复。
    MyISAM: 在崩溃时可能会导致数据损坏,需要手动进行修复。
外键约束:
    InnoDB: 支持外键约束,可以定义和管理外键。
    MyISAM: 不支持外键约束,外键定义会被忽略。
全文本搜索:
    InnoDB: 支持全文本搜索,可以使用 FULLTEXT 索引进行高效的全文本搜索。
    MyISAM: 专门优化了全文本搜索,性能在这方面可能更好。
表级锁和行级锁:
    InnoDB: 支持行级锁,可以提高并发性,减小锁冲突。
    MyISAM: 支持表级锁,锁定整个表而不是单独的行。
存储方式和索引:
    InnoDB: 数据存储在聚簇索引(主键索引)上,辅助索引实际上是主键索引的一部分。支持自动增量的主键。
    MyISAM: 数据和索引是分开存储的,主键索引和辅助索引是分开的。自动增量的主键可以提高性能。
表空间和缓冲池:
    InnoDB: 具有表空间和缓冲池的概念,支持更精细的内存管理。
    MyISAM: 没有表空间的概念,使用操作系统缓存进行缓存。

18.2 使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。MySQL 会字段进行所有的索引和重新索引

18.2.1 启用全文本搜索支持

sql 复制代码
输入: CREATE TABLE articles (id INT PRIMARY KEY, title VARCHAR(255), content TEXT, FULLTEXT(content)) ENGINE = InnoDB;
输出: Query OK, 0 rows affected (0.20 sec)
分析: 在这个案例中,我们创建了一个名为 articles 的表,包含了 id、title 和 content 列。通过在 content 列上使用 FULLTEXT 子句,我们启用了对该列的全文本搜索, ENGINE = InnoDB 是在 MySQL 数据库中用于指定存储引擎的一部分 SQL 语法
​
注意: 不要在导入数据时使用 FULLTEXT,应该先导入所有数据,然后修改定义表

18.2.2 进行全文本搜索

sql 复制代码
前提条件创建索引: ALTER TABLE global_grants ADD FULLTEXT(PRIV);
​
输入: SELECT * FROM global_grants WHERE MATCH(PRIV) AGAINST('SET_USER_ID');
输出:
+------+-----------+-------------+-------------------+
| USER | HOST      | PRIV        | WITH_GRANT_OPTION |
+------+-----------+-------------+-------------------+
| root | localhost | SET_USER_ID | Y                 |
+------+-----------+-------------+-------------------+
分析: MATCH() 指示 MySQL 针对指定的列进行搜索, AGAINST() 指定词作为搜索文本
​
注意: 
    1. 传递给 MATCH() 的值必须与 FULLTEXT() 定义中的相同,如果指定多个列,则必须列出它们(而且次序正确)
    2. 除非使用 BINARY 方式,否则全文本搜索不区分大小写
    
匹配算法:
    全文本搜索: 使用更复杂的匹配算法,可以处理同义词、词干变化等,并考虑词的相关性。它不仅仅匹配关键词,还会提供相关性评分,使得搜索结果更加精准。
    LIKE 搜索: 使用简单的字符串匹配算法,基于通配符进行模式匹配。它只关注字符串的字面匹配,不考虑词语之间的语义关系。
排序方式:
    全文本搜索: 结果可以根据匹配度、相关性得分等进行排序,使得最相关的结果排在前面。这通常提供更有用和易读的搜索结果。
    LIKE 搜索: 结果的排序通常是按照数据库中存储的顺序,或者是根据索引的排序。不会根据匹配度或相关性对结果进行排序。
性能:
    全文本搜索: 在大型文本数据集中,全文本搜索通常具有更好的性能,因为它使用了全文本索引和高效的搜索算法。这使得全文本搜索适用于处理大量文本数据的场景。
    LIKE 搜索: 对于大型文本数据集,LIKE 搜索可能会导致性能问题,尤其是在没有索引支持的情况下,因为它需要逐行进行字符串匹配。
语义处理:
    全文本搜索: 具有一定的语义处理能力,能够理解词之间的关系,支持同义词、词干处理等。
    LIKE 搜索: 只是进行简单的字符串匹配,不具备语义处理的能力。
适用场景:
    全文本搜索: 适用于需要处理大量自然语言文本的场景,如文章搜索、博客搜索、全文检索等。
    LIKE 搜索: 适用于基于简单字符串模式匹配的场景,如查找以特定前缀或后缀开头的字符串。

18.2.3 使用查询扩展

sql 复制代码
询扩展是一种用于改善搜索结果的技术,旨在通过添加或扩展用户原始查询中的相关术语,以提供更全面、准确或相关的搜索结果。该技术的目标是解决用户可能未考虑到的相关概念,从而提高搜索引擎的效果。

主要思想是在用户的查询中引入额外的关键词或术语,以使搜索更加全面,包括与用户原始查询相关的其他概念。这样可以避免搜索引擎仅依赖于用户输入的限定词,而能够更好地理解用户的意图并提供更丰富的搜索结果。

查询扩展的方法可以包括:
    同义词扩展: 引入与用户查询中的词汇相近或同义的其他词汇。
    相关主题扩展: 添加与用户查询相关但可能未明确提及的相关主题。
    近义词扩展: 引入与用户查询中的词汇在语义上相似但可能不完全相同的词汇。
    模糊查询扩展: 考虑到用户查询中可能存在的拼写错误或近似匹配。
    行业术语扩展: 根据用户查询的背景,引入相关领域内的专业术语。
    用户偏好扩展: 考虑用户的个人偏好,根据先前搜索历史或用户属性推断可能感兴趣的领域。
    地理位置扩展: 如果用户查询涉及地理位置,可以扩展为相关地理位置的查询。
    
查询扩展的实施可以基于自然语言处理、机器学习、统计分析等技术。通过这种方式,搜索引擎能够更好地适应用户的搜索需求,提供更丰富和有用的搜索结果。

18.2.3 布尔文本搜索

sql 复制代码
IN BOOLEAN MODE 指定布尔模式
​
输入: SELECT * FROM documents WHERE MATCH(title, content) AGAINST('+"database" +"performance"' IN BOOLEAN MODE);
分析: 查找同时包含 "database" 和 "performance" 的文档,'+' 表示必须包含该词
​
输入: SELECT * FROM documents WHERE MATCH(title, content) AGAINST('+"database" OR +"sql"' IN BOOLEAN MODE);
分析: 查找包含 "database" 或 "sql" 的文档, OR 指示搜索引擎返回包含任一关键词的文档
​
输入: SELECT * FROM documents WHERE MATCH(title, content) AGAINST('+"database" -"mysql"' IN BOOLEAN MODE);
分析: 查找包含 "database" 但不包含 "mysql" 的文档, "-" 表示不包含该词
​
输出: SELECT * FROM documents WHERE MATCH(title, content) AGAINST('+"database" +("performance" OR "sql")' IN BOOLEAN MODE);
分析: 查找同时包含 "database" 和 ("performance" 或 "sql") 的文档, 使用括号指定运算符的优先级
​
其他布尔操作符     说明
>                包含,而且增加等级值
<                包含,且减少等级值
~                取消一个词的排序值
*                词尾的通配符
""               定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)
相关推荐
六月闻君10 分钟前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
hopetomorrow10 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
网络安全-杰克18 分钟前
网络安全概论
网络·web安全·php
SelectDB技术团队19 分钟前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
小牛itbull20 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i29 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落31 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
inventecsh35 分钟前
mongodb基础操作
数据库·mongodb
白云如幻39 分钟前
SQL99版链接查询语法
数据库·sql·mysql
GIS瞧葩菜41 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript