简介:

Elasticsearch是一款非常强大的开源搜索引擎,Elasticsearch还有关联的一整套技术栈,包含Kibana、Logstash等组件,称为ELK。被广泛应用在日志数据分析、系统实时监控等领域。Elasticsearch核心是基于Apache Lucene库实现的。

Elasticsearch有如此高性能的搜索表现,是基于底层的倒排索引技术,而MySQL是基于正向索引。

正向索引和倒排索引:

  • 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。

  • 而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。

优缺点:

正向索引:

  • 优点:可以给多个字段创建索引,根据索引字段搜索、排序速度非常快;

  • 缺点:根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描

倒排索引:

  • 优点:根据词条搜索、模糊搜索时,速度非常快;

  • 缺点:只能给词条创建索引,而不是字段,无法根据字段做排序;

基本概念:

Elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似之处

索引和映射:

随着业务发展,需要在es中存储的文档也会越来越多,比如有商品的文档、用户的文档、订单文档等等,因此,我们可以把索引当做是数据库中的;

数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束

文档和字段:

Elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为JSON格式后存储在Elasticsearch中;原本数据库中的一行数据就是ES中的一个JSON文档;而数据库中每行数据都包含很多列,这些列就转换为JSON文档中的字段(Field)

MySQL

Elasticsearch

说明

Table

Index

索引(index),就是文档的集合,类似数据库的表(table)

Row

Document

文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式

Column

Field

字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)

Schema

Mapping

Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)

SQL

DSL

DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

各自擅长之处:

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性

  • Elasticsearch:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用:

  • 对安全性要求较高的写操作,使用mysql实现

  • 对查询性能要求较高的搜索需求,使用elasticsearch实现

  • 两者再基于某种方式,实现数据的同步,保证一致性