SpringCloud 之 ElasticSearch(一)

206 阅读4分钟

初识elasticsearch

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

elasticSearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中 快速找到我们想要的内容

比如说我们的google,滴滴打车搜索附近车辆呀,都可以被elasticSearch实现

image-20221013112415617

kibana, logstach, beats这些其实都可以被其他东西替代,毕竟Kibana这个东西只是个可视化平台,数据抓取的话,python好用的不要太多,而elasticSearch则是不可被替代的

我们来看看elsearch的使用率

image-20221013113042515

没错,他正是最受欢迎的搜索引擎技术!

所以,我们一定得学!

倒排索引

正向索引和倒排索引

传统数据库,比如mysql采用的是正向索引,例如我们给下面的表(tb_goods)中的id创建索引:

idtitleprice
.........

我们都知道,mysql会将表中的数据基于id创建索引,创建一个B+树,这就是一个正向索引,如果我们想要通过title这个字段搜索呢?一般我们是不会给它加上索引的,因为我们一般只会搜一个标题的一部分,而这种场景mysql就会自动拼接 like 语句,那么此时的索引也会失效。mysql会扫描每一行,将符合结果的数据放入结果集。

但是噢,想象一个场景,如果说,这个数据有1亿条,每搜索一个,都要全扫一遍,是不是性能极差?

倒排索引

那么倒排索引又是怎么去做的呢?

这是一张正向索引的表

image-20221013114630038

那么我们怎么给它变成一个倒排索引的表呢?

在此之前,我们先了解一下文档和词条的概念

  • 文档(document):每条数据就是一个文档
  • 词条(term):文档按照语义分成的词语

image-20221013114937255

他会变成上面那样的倒排索引。变成一个个词条,并且对应不同的文档id

这样就确保了词条字段绝对不会重复,这样我们就可以根据词条创建索引啦!

比如:当我们搜索“华为手机”的时候,我们会得到“华为”,“手机”俩词条,然后我们会根据词条去搜索文档id,然后根据文档id去上搜索对应的文档,存入结果集。是不是俩次查都用了索引啊?效率毫无疑问是非常高的!

文档

elasticsearch是一个面向文档存储的,可以是数据库的一条商品数据,可以是一个订单信息。

文档数据会被序列化成json格式之后存储在elasticsearch中

索引

索引是啥?它是相同类型的文档的集合

例如:

image-20221013154515203

这么多杂乱文章的文档,可以分为,商品索引,用户索引,订单索引,是不是有点像数据库里面表结构的概念呢?但是在elsearch里面,我们对这种索引中文档字段的约束信息,叫做映射(mapping)

image-20221013154524992

既然mysql和elasticSearch有很多相似点和不同点,那我们来整理一下

MysqlElasticSearch说明
Table(表)Index索引(Index),就是文档的集合,类似数据库的表
RowDocument文档,就是一条一条的数据
ColumnField字段(Field),就是JSON文档中的字段,类似数据库的列
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型的约束,类似数据库的表结构
SQLDSLDSL是elecsearch提供的JSON风格的请求语句,用来操作实现CRUD

注意在mysql操作的时候我们是不是要通过一个连接和mysql连接,然后再操作啊?

但是DSL不同,我们只需要发一个RESTFUL的http请求,任何语言只要能发http请求,都能用他!方便的一批

那么我们是不是可以断言el就是比mysql强呢?

其实不是的,因为从架构的方面来说

  • mysql:擅长事务类型操作,可以确保数据的安全一致性
  • ElasticSearch:擅长海量数据的搜索,分析,计算

如果说你对事务的安全性要求极高,比如说下单这类服务,你就不能用el啦,mysql是更好的选择!

但是如果你要对海量数据进行搜索,毫无疑问的选择el!

因此,他俩是不是互补的呀!

image-20221013161032718

补充一下,el进行读的操作的时候,是不是得有数据才能读呀,这时候,mysql同样也会写入el中,进行一次很好的数据同步!

好啦讲了这么多的基础概念,下一章我们就可以进行一次实战吧