Elasticsearch
约 3279 字大约 11 分钟
2025-02-27
Elasticsearch简介
Elasticsearch简介:Elasticsearch是一个分布式的搜索和分析引擎,位于 Elastic Stack(以前称为 ELK Stack)的核心。它设计用于处理所有类型的数据,包括结构化和非结构化文本、数字数据以及地理空间数据。Elasticsearch 能够提供近乎实时的搜索和分析能力,支持快速搜索和高效存储数据。它的分布式特性使得随着数据和查询量的增长,部署能够无缝扩展。Elasticsearch 使用 Lucene 作为其核心,并通过 RESTful API 提供其功能,支持多租户和各种编程语言的客户端库。
在 Elasticsearch 中,数据以文档的形式存储,每个文档都被序列化为 JSON 格式。文档被存储在索引(index)中,索引是相同类型文档的集合。映射(mapping)定义了文档字段的约束,如字段名和数据类型。Elasticsearch 集群由一个或多个节点组成,每个节点是一个 Elasticsearch 实例,通常运行在独立的服务器上。数据在节点之间进行复制和分片以提高可用性和性能。
Elasticsearch背景
- 1999年Doug Cutting基于Lucene开发了Lucene Lucene 是 Apache 基金会开发的开源搜索引擎。它是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目。Lucene 可以快速、高效地处理大量的文档,并且提供全文搜索、结构化搜索、Faceted Search、排序、地理空间搜索等功能。
- 2000年Sun公司收购了Apache基金会,并将Lucene作为Sun的基础软件之一。
- 2004年Shay Banon基于Lucene开发了Compass
- 2010年Shay Banon 重写了Compass,取名为Elasticsearch
什么是ELK Stack?
ELK Stack(Elasticsearch、Logstash、Kibana)是 Elasticsearch、Logstash、Kibana 的简称,是 Elasticsearch、Logstash、Kibana 三者组合而成的开源日志分析工具。
- Elasticsearch:是一个开源的搜索和分析引擎,能够轻松地存储、搜索、分析大量的数据。
- Logstash:是一个开源的数据收集引擎,能够实时地从不同来源采集数据,并将其转化为 Elasticsearch 可以理解的格式。
- Kibana:是一个开源的可视化分析工具,能够帮助用户从 Elasticsearch 中提取数据,并通过图表、表格、地图等方式呈现。
Elasticsearch优势
- 快速、高效:ES 采用 Lucene 作为其核心,Lucene 是一个开源的全文搜索引擎类库,能够快速、高效地处理大量的数据。 ES 能够快速地搜索、分析数据,并提供近乎实时的搜索和分析能力。
- 全文搜索:ES 提供全文搜索功能,能够对文本数据进行索引,并支持多种查询方式,包括模糊查询、布尔查询、正则表达式查询等。
- 结构化搜索:ES 提供结构化搜索功能,能够对结构化数据进行索引,并支持多种查询方式,包括精确值查询、范围查询、排序、聚合等。
- 地理空间搜索:ES 提供地理空间搜索功能,能够对地理空间数据进行索引,并支持多种查询方式,包括距离查询、地理位置聚合等。
- 高可用性:ES 采用分布式架构,能够在集群中自动分配数据,并提供高可用性。
- 易于扩展:ES 采用 RESTful API 接口,支持多种编程语言的客户端库,能够方便地集成到各种应用系统中。
- 灵活的数据模型:ES 支持多种数据模型,包括文档、字段、对象、嵌套、数组等,能够灵活地存储和索引数据。
- 自动发现:ES 可以自动发现数据中的模式,并对其进行索引,能够对复杂的数据进行快速搜索和分析。
- 易于部署:ES 可以方便地部署和管理,支持多种部署方式,包括 Docker、Kubernetes、云平台等。
Elasticsearch相关概念
- 集群(Cluster):一个或多个节点(Node)组成的集群,提供分布式的存储、搜索和分析功能。
- 节点(Node):一个服务器,作为集群中的一个成员,存储数据,提供搜索和分析功能。
- 索引(Index):一个逻辑上的数据库,存储数据,类似于关系型数据库中的表。
- 类型(Type):索引的一种逻辑分区,类似于关系型数据库中的表中的字段。
- 文档(Document):一个可被索引的记录,类似于关系型数据库中的行。
- 字段(Field):文档中的一个属性,类似于关系型数据库中的列。
- 映射(Mapping):定义文档的字段和数据类型,类似于关系型数据库中的表结构。
- 路由(Routing):决定将文档路由到哪个分片(Shard)的过程。
- 分片(Shard):一个 Lucene 实例,存储一个或多个索引。
- 副本(Replica):一个 Lucene 实例的复制品,用于提高搜索和分析性能。
- 倒排索引(Inverted Index):一种索引方法,能够快速地检索文档。
- 分析器(Analyzer):用于对文本进行分词、词干提取、停用词过滤等操作的组件。
- 聚合(Aggregation):对搜索结果进行汇总、分析的过程。
- 脚本(Script):一种基于 JavaScript 的语言,用于对文档进行复杂的操作。
- 客户端(Client):与 Elasticsearch 交互的工具,如 Kibana、Logstash、Beats 等。
- 集群管理器(Cluster Manager):用于管理集群的工具,如 Elasticsearch 自带的 Elasticsearch 管理器、Kibana 管理器等。
倒排索引
倒排索引:倒排索引是一种索引方法,能够快速地检索文档。倒排索引是一种索引方法,它将文档中的每个词条映射到一个或多个文档的列表中。倒排索引的主要作用是快速地检索文档。
理解倒排索引搜索原理:
假设我们有一篇文章,文章中有如下内容:“Elasticsearch 是一款开源的搜索和分析引擎”。
我们将文章中的每个词条都视为一个单词,并将其倒排索引。倒排索引的结构如下:
- 词条:Elasticsearch、是、一款、开源、搜索、分析、引擎
- 文档列表:文章1 当用户搜索“Elasticsearch”时,可以快速地找到包含该词条的文档列表,并返回给用户。
倒排索引中有两个非常重要的概念:
- 文档(Document):一个可被索引的记录,类似于关系型数据库中的行。例如:一篇文章就是一个文档。一个商品信息就是一个文档。
- 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:“我时中国人”,就可以分为:我、是、中国人、中国、国人、国、人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理,流程如下:
- 将每一个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档id、位置等信息
- 因为词条唯一性,可以给词条创建索引,例如hash表结构索引 如图:
倒排索引的搜索流程如下(以搜索"华为手机"为例):
- 输入“华为手机”
- 词条分词:“华为”、“手机”
- 遍历倒排索引表,找到包含“华为”和“手机”的文档列表
- 返回文档列表
虽然要先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。
文档(Document)
文档是 Elasticsearch 数据库中的基本数据单元。它是一个可序列化的 JSON 对象,用于描述实体(例如用户、产品等)的属性和其对应的值。每个文档都必须属于一个特定的类型,并被存储在相应的索引中。
文档相当于关系型数据库中的行,字段相当于关系型数据库中的列。
elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中:
{
"name": "iphone",
"price": 8999,
"description": "这是一个很棒的手机"
}
字段(Field)
字段是文档的属性,它是一个键值对,用于描述文档的一些特性。字段可以是数字、字符串、布尔值、日期、数组、对象等。
字段的类型决定了字段的值的类型,例如:字符串字段可以存储字符串,数字字段可以存储整数、浮点数等。
字段可以被索引,使得 Elasticsearch 可以对其进行快速的检索。
索引(Index)
索引是 Elasticsearch 数据库中的逻辑存储单元。它是一个相互关联的文档集合,类似于关系型数据库中的表。索引由一个或多个分片(Shard)组成,每个分片是一个 Lucene 实例,存储一个或多个索引。
索引相当于关系型数据库中的数据库,文档相当于关系型数据库中的表,字段相当于关系型数据库中的列。
索引的名称必须全部小写,并且不能以下划线开头。
索引是文档(Document)的容器,是一类文档的集合。 例如:
- 所有用户文档,就可以组织在一起,称为用户的索引;
- 所有商品的文档,可以组织在一起,称为商品的索引;
- 所有订单的文档,可以组织在一起,称为订单的索引;
因此,我们可以把索引当做是数据库中的表,把文档当做是表中的行,把字段当做是列。
映射(Mapping)
映射是索引的元数据,它定义了索引的字段名称、类型、是否索引、是否存储等。
当我们创建索引时,必须指定映射,否则 Elasticsearch 不会对文档进行索引。
映射定义了文档的字段名称、类型、是否索引、是否存储等。
类似于关系型数据库中的表结构。
例如:
{
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "float"
},
"description": {
"type": "text"
}
}
}
ES与MySQL对比
MySQL是关系型数据库,而Elasticsearch是非关系型数据库。
MySQL的优点:
- 结构化数据:MySQL支持结构化数据,可以存储结构化的数据,如表格、关系图等。
- 关系型数据库:MySQL支持关系型数据库,可以存储和处理关系型数据,如表、关系等。
- 事务处理:MySQL支持事务处理,可以确保数据的一致性。
- 完整性:MySQL支持完整性约束,可以确保数据的准确性。
- 性能:MySQL的性能非常高,可以处理大量的数据。
Elasticsearch的优点:
- 灵活的数据模型:Elasticsearch支持多种数据模型,如文档、字段、对象、嵌套、数组等,可以灵活地存储和索引数据。
- 全文搜索:Elasticsearch支持全文搜索,可以对文本数据进行索引,并支持多种查询方式,包括模糊查询、布尔查询、正则表达式查询等。
- 地理空间搜索:Elasticsearch支持地理空间搜索,可以对地理空间数据进行索引,并支持多种查询方式,包括距离查询、地理位置聚合等。
- 高可用性:Elasticsearch采用分布式架构,可以自动分配数据,并提供高可用性。
- 易于扩展:Elasticsearch支持易于扩展,可以方便地部署和管理,支持多种部署方式,包括 Docker、Kubernetes、云平台等。
各自长处:
- Mysql:擅长事务类型操作,可以确保数据的安全和一致性
- Elasticsearch:擅长海量数据的搜索、分析、计算
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实现
- 两者再基于某种方式,实现数据的同步,保证一致性