初识elasticsearch
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
elasticSearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中 快速找到我们想要的内容
比如说我们的google,滴滴打车搜索附近车辆呀,都可以被elasticSearch实现!
kibana, logstach, beats这些其实都可以被其他东西替代,毕竟Kibana这个东西只是个可视化平台,数据抓取的话,python好用的不要太多,而elasticSearch则是不可被替代的
我们来看看elsearch的使用率
没错,他正是最受欢迎的搜索引擎技术!
所以,我们一定得学!
倒排索引
正向索引和倒排索引
传统数据库,比如mysql采用的是正向索引,例如我们给下面的表(tb_goods)中的id创建索引:
| id | title | price |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 | ||
| ... | ... | ... |
我们都知道,mysql会将表中的数据基于id创建索引,创建一个B+树,这就是一个正向索引,如果我们想要通过title这个字段搜索呢?一般我们是不会给它加上索引的,因为我们一般只会搜一个标题的一部分,而这种场景mysql就会自动拼接 like 语句,那么此时的索引也会失效。mysql会扫描每一行,将符合结果的数据放入结果集。
但是噢,想象一个场景,如果说,这个数据有1亿条,每搜索一个,都要全扫一遍,是不是性能极差?
倒排索引
那么倒排索引又是怎么去做的呢?
这是一张正向索引的表
那么我们怎么给它变成一个倒排索引的表呢?
在此之前,我们先了解一下文档和词条的概念
- 文档(document):每条数据就是一个文档
- 词条(term):文档按照语义分成的词语
他会变成上面那样的倒排索引。变成一个个词条,并且对应不同的文档id
这样就确保了词条字段绝对不会重复,这样我们就可以根据词条创建索引啦!
比如:当我们搜索“华为手机”的时候,我们会得到“华为”,“手机”俩词条,然后我们会根据词条去搜索文档id,然后根据文档id去上搜索对应的文档,存入结果集。是不是俩次查都用了索引啊?效率毫无疑问是非常高的!
文档
elasticsearch是一个面向文档存储的,可以是数据库的一条商品数据,可以是一个订单信息。
文档数据会被序列化成json格式之后存储在elasticsearch中
索引
索引是啥?它是相同类型的文档的集合
例如:
这么多杂乱文章的文档,可以分为,商品索引,用户索引,订单索引,是不是有点像数据库里面表结构的概念呢?但是在elsearch里面,我们对这种索引中文档字段的约束信息,叫做映射(mapping)
既然mysql和elasticSearch有很多相似点和不同点,那我们来整理一下
| Mysql | ElasticSearch | 说明 |
|---|---|---|
| Table(表) | Index | 索引(Index),就是文档的集合,类似数据库的表 |
| Row | Document | 文档,就是一条一条的数据 |
| Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库的列 |
| Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型的约束,类似数据库的表结构 |
| SQL | DSL | DSL是elecsearch提供的JSON风格的请求语句,用来操作实现CRUD |
注意在mysql操作的时候我们是不是要通过一个连接和mysql连接,然后再操作啊?
但是DSL不同,我们只需要发一个RESTFUL的http请求,任何语言只要能发http请求,都能用他!方便的一批
那么我们是不是可以断言el就是比mysql强呢?
其实不是的,因为从架构的方面来说:
- mysql:擅长事务类型操作,可以确保数据的安全和一致性
- ElasticSearch:擅长海量数据的搜索,分析,计算
如果说你对事务的安全性要求极高,比如说下单这类服务,你就不能用el啦,mysql是更好的选择!
但是如果你要对海量数据进行搜索,毫无疑问的选择el!
因此,他俩是不是互补的呀!
补充一下,el进行读的操作的时候,是不是得有数据才能读呀,这时候,mysql同样也会写入el中,进行一次很好的数据同步!
好啦讲了这么多的基础概念,下一章我们就可以进行一次实战吧