目录
1.什么是elasticserach?
elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到我们需要的内容。(https://www.elastic.co/)
elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK),被广泛应用在日志数据分析、实时监控等领域。
elasticsearch是elastic stack的核心,负责存储、搜索和分析数据。
2.elasticsearch的发展
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址: https://lucene.apache.orgl 。
Lucene的优势:
- 易扩展
- 高性能(基于倒排索引)
缺点:
- 只限于Java语言开发
- 学习曲线陡峭(深入学习难度高)
- 不支持水平扩展
相比与lucene,elasticsearch具备下列优势:
- ·支持分布式,可水平扩展
- ·提供Restful接口,可被任何语言调用
3.正向索引和倒排索引
3.1正向索引
在传统数据库中(例如MySQL)采用的是正向索引,如下表(tb_goods):
id | goodName | price |
1 | 小米Max | 123 |
2 | 小米充电器 | 566 |
3 | 华为充电器 | 234 |
... | ... | ... |
它是根据id建立索引去查找内容的。
如果你想查找这个表中有没有包含充电器的信息,那你是不是无法通过某个字段去精确查找,要通过模糊查询来查找,那你就会写一个SQL语句:“select * fromtb_goods where goodName like '%充电器%' ”,然后将得到的数据存入结果集返回。
步骤:
- 搜索充电器,“select * fromtb_goods where goodName like '%充电器%' ”
- 数据库去表中逐行查找匹配的数据
- 将得到的结果存入结果集返回
看上去是不是很简单,很容易找到?这种方法在数据相对少的时候还比较好用,但是当数据多了呢?成千上万行呢?因为它检索是逐行进行的,每次检查一行都要去执行判断,非常消耗性能,而且响应时间长,影响用户体验。
3.2倒排索引
elasticsearch采用了倒排索引:
- 文档(document):每条数据就是一个文档
- 词条(term):文档按照语义分成的词语
id | goodName | price |
1 | 小米Max | 123 |
2 | 小米充电器 | 566 |
3 | 华为充电器 | 234 |
... | ... | ... |
||
词条(term) | 文档id |
小米 | 1,2 |
Max | 1 |
充电器 | 2,3 |
华为 | 3 |
倒排索引中,它是根据词条去查找id
比如你想搜索小米充电器,首先经过分词,“小米充电器” 会被拆分为 “小米” 和 “充电器”,然后将这些词拿到词条列表中去查找,得到结果:
- 小米:文档id(1,2)
- 充电器:文档id(2,3)
然后存入结果集返回
从过程来看,倒排索引的查找效率非常高
4.ES与MySQL的概念对比
文档
文档(document):可以理解为一个表中的一条行数据
elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一条订单信息。
文档数据会被序列化为json格式后存储在elasticsearch中
索引
- 索引(index):相同类型的文档的集合(可以理解一张表)
- 映射(mapping):索引中文档的字段约束信息,类似于表的结构约束
概念对比
MySQL | Elasticsearch | 说明 |
Table | Index | 索引(INDEX),就是文档的集合,类似数据库的表 |
Row | Document | 文档(Document),就是一条条数据,类似于数据库中的行,但文档只支持JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段(或者说键),类似于数据库中的列 |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型的约束。类似于数据库中的表结构 |
SQL | DSL | DSL是elasticsearch提供restful风格+json风格的请求语句,用来操作elasticsearch,实现CRUD |
架构
Mysql:擅长事务类型操作,可以确保数据的安全和一致性。
Elasticsearch:擅长海量数据的搜索、分析、计算。
其他的内容会在本专栏后面继续说明......