您的位置:首页 > 汽车 > 新车 > MySQL 保姆级教程(十六):全文本搜索

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

2024/10/19 14:31:10 来源:https://blog.csdn.net/2302_82189125/article/details/140911383  浏览:    关键词: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 启用全文本搜索支持

输入: 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 进行全文本搜索

前提条件创建索引: 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 使用查询扩展

询扩展是一种用于改善搜索结果的技术,旨在通过添加或扩展用户原始查询中的相关术语,以提供更全面、准确或相关的搜索结果。该技术的目标是解决用户可能未考虑到的相关概念,从而提高搜索引擎的效果。主要思想是在用户的查询中引入额外的关键词或术语,以使搜索更加全面,包括与用户原始查询相关的其他概念。这样可以避免搜索引擎仅依赖于用户输入的限定词,而能够更好地理解用户的意图并提供更丰富的搜索结果。查询扩展的方法可以包括:同义词扩展: 引入与用户查询中的词汇相近或同义的其他词汇。相关主题扩展: 添加与用户查询相关但可能未明确提及的相关主题。近义词扩展: 引入与用户查询中的词汇在语义上相似但可能不完全相同的词汇。模糊查询扩展: 考虑到用户查询中可能存在的拼写错误或近似匹配。行业术语扩展: 根据用户查询的背景,引入相关领域内的专业术语。用户偏好扩展: 考虑用户的个人偏好,根据先前搜索历史或用户属性推断可能感兴趣的领域。地理位置扩展: 如果用户查询涉及地理位置,可以扩展为相关地理位置的查询。查询扩展的实施可以基于自然语言处理、机器学习、统计分析等技术。通过这种方式,搜索引擎能够更好地适应用户的搜索需求,提供更丰富和有用的搜索结果。

18.2.3 布尔文本搜索

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com