第 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") 的文档, 使用括号指定运算符的优先级
其他布尔操作符 说明
> 包含,而且增加等级值
< 包含,且减少等级值
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语)