悟纤:哎,头发都白了~
师傅:徒儿这是怎么了?
悟纤:最近发现mysql的like “%sprinboot%” 查询很慢呢?
师傅:徒儿,你这是全表扫描了,在数据量大的情况下,确实查询会比较慢。
悟纤:师傅,那这个怎么办,这个搜索功能少不了呀。
师傅:这个师傅就要用到搜索引擎了。
悟纤:那师傅,你赶紧教教我这个技能呢。
师傅:为师正有这个打算。
悟纤:那真是太好了。开干!!!!!!
导读
Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。
在学习ElasticSearch之前,要先学习一些基本的概念,这一小节的话,先来了解下全文检索概念。
一、什么是全文检索
1.1 全文检索基本概念
全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子邮件客户端、新闻聚合网站等。它可以帮助用户快速定位所需信息,提高检索效率和准确性。
(1)查询:有明确的搜索条件边界。比如,年龄 15~25 岁,颜色 = 红色,价格 < 3000,这里的 15、25、红色、3000 都是条件边界。即有明确的范围界定。
(2)检索:即全文检索,无搜索条件边界,召回结果取决于相关性,其相关性计算无明确边界性条件,如同义词、谐音、别名、错别字、混淆词、网络热梗等均可成为其相关性判断依据。
说明:显示了符合包含java和设计模式的搜索结果,并且对于java、设计模式进行了高亮显示。
1.2 用传统关系型数据库实现搜索存在的问题
设想一个关于全文检索的场景,比如搜索Java设计模式:
思考一下:用传统关系型数据库实现有什么问题?
如果是用MySQL存储文章 ,我们应该会使用这样的 SQL 去查询:
select * from t_blog where content like "%Java设计模式%"
这种需要遍历所有的记录进行匹配,不但效率低,而且搜索结果不符合我们搜索时的期望。
二、全文检索的原理
在全文检索中,首先需要对文本数据进行处理,包括分词、去除停用词等。
然后,对处理后的文本数据建立索引,索引会记录每个单词在文档中的位置信息以及其他相关的元数据,如词频、权重等。这个过程通常使用倒排索引(inverted index)来实现,倒排索引将单词映射到包含该单词的文档列表中,以便快速定位相关文档。
当用户发起搜索请求时,搜索引擎会根据用户提供的关键词或短语,在建立好的索引中查找匹配的文档。搜索引擎会根据索引中的信息计算文档的相关性,并按照相关性排序返回搜索结果。用户可以通过不同的搜索策略和过滤条件来精确控制搜索结果的质量和范围。
三、什么是倒排索引
正排索引(Forward Index)和倒排索引(Inverted Index)是全文检索中常用的两种索引结构,它们在索引和搜索的过程中扮演不同的角色。
3.1正排索引(正向索引)
正排索引是将文档按顺序排列并进行编号的索引结构。每个文档都包含了完整的文本内容,以及其他相关的属性或元数据,如标题、作者、发布日期等。在正排索引中,可以根据文档编号或其他属性快速定位和访问文档的内容。正排索引适合用于需要对文档进行整体检索和展示的场景,但对于包含大量文本内容的数据集来说,正排索引的存储和查询效率可能会受到限制。
在MySQL 中通过 ID 查找就是一种正排索引的应用。
3.2倒排索引(反向索引)
倒排索引是根据单词或短语建立的索引结构。它将每个单词映射到包含该单词的文档列表中。倒排索引的建立过程是先对文档进行分词处理,然后记录每个单词在哪些文档中出现,以及出现的位置信息。通过倒排索引,可以根据关键词或短语快速找到包含这些词语的文档,并确定它们的相关性。倒排索引适用于在大规模文本数据中进行关键词搜索和相关性排序的场景,它能够快速定位文档,提高搜索效率。
我们在创建文章的时候,建立一个关键词与文章的对应关系表,就可以称之为倒排索引。如下图所示:
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7