Elasticsearch的简单介绍
Elasticsearch(简称为ES)是一个开源的分布式搜索和分析引擎,建立在Apache Lucene搜索引擎库的基础上,提供了一个强大的全文搜索和分析引擎,适用于各种类型的数据。Elasticsearch最初是为处理大规模文本数据而设计的,但后来扩展到支持结构化数据和地理空间数据等多种数据类型。
Elasticsearch的核心特性
- 分布式性质: Elasticsearch是一个分布式系统,它使用分片和副本的概念,将数据分散存储在多个节点上,可以轻松地水平扩展,处理大规模的数据集。
- 全文搜索: Elasticsearch提供强大的全文搜索功能,支持实时索引和查询。它使用倒排索引(Inverted Index)来加速搜索过程,使得搜索在大规模数据集下仍能迅速响应。
- 多数据类型支持: Elasticsearch不仅支持文本数据,还能处理结构化数据、数字数据、日期数据以及地理空间数据。
- RESTful API: Elasticsearch使用RESTful API进行与客户端的交互,这使得它易于集成到各种应用中。用什么语言都可以进行开发。
- 实时性能: Elasticsearch提供了实时性能,可以在数据变化时立即更新索引。
介绍Elasticsearch肯定是离不开ELK的,那么ELK是什么呢?
ELK
(Elasticsearch、Logstash、Kibana) 是一个用于日志管理和数据分析的开源软件栈,主要用途之一是实时日志分析。通过Logstash收集各种来源的日志数据,将其标准化后存储到Elasticsearch中,最后使用Kibana进行可视化和查询。ELK Stack通常用于实时监控、故障排查、性能优化以及安全事件分析等场景。,Elasticsearch前面我们已经介绍过了,接下来简单介绍一下Logstash
、Kibana
ELK Stack
- Logstash: Logstash 是一个用于日志和事件数据的收集、转换和传输的工具。它能够从多种来源(如文件、数据库、消息队列)收集数据,对数据进行标准化和转换,然后将其发送到Elasticsearch。
- Kibana: Kibana 是一个用于数据可视化的开源平台,允许用户通过 Web 界面对 Elasticsearch 中的数据进行搜索、分析和可视化。Kibana提供了各种图表和仪表板,使用户能够以直观的方式理解和探索其数据。
Elasticsearch的核心概念
- 索引(Index): 索引是Elasticsearch中最基本的数据存储单元。它类似于关系数据库中的数据库,用于组织和存储相关的文档。每个索引可以包含一个或多个分片。
- 文档(Document): 文档是Elasticsearch中的基本信息单元。它是JSON格式的数据,包含实际的数据和元数据。在关系数据库(MySQL)中,文档可以看作是行(record)。
- 类型(Type): 在Elasticsearch 7.x及以上版本中,一个索引只能包含一个类型,通常是"_doc"。在之前的版本中,索引可以包含多个类型,但这种方式已经过时。
- 分片(Shard): Elasticsearch将索引分成多个分片,每个分片是一个独立的索引单元,可以分布在不同的节点上。分片的引入使得Elasticsearch能够水平扩展,处理大规模的数据。
- 副本(Replica): 为了提高数据的可用性和容错性,Elasticsearch允许为每个分片创建多个副本。副本是分片的复制品,存储在集群中的不同节点上。副本可以代替主分片,处理读取请求或在主分片不可用时提供服务。
- 节点(Node): 节点是构成Elasticsearch集群的单个服务器实例。每个节点是独立的,可以存储数据、执行搜索和参与集群管理。节点通过集群协调和通信,共同构成一个完整的Elasticsearch集群。
- 集群(Cluster): 集群是由一个或多个节点组成的集合,共同存储和处理数据。集群有一个唯一的名称,节点通过这个名称来加入同一个集群。集群协调工作的节点称为主节点。
- 主分片和复制分片: 每个索引的分片都有一个主分片和零个或多个复制分片。主分片负责处理索引的所有写入操作,而复制分片提供了读取操作的冗余和负载均衡。
- 映射(Mapping): 映射定义了索引中的文档如何被存储和索引。它类似于关系数据库中的模式,定义了字段的类型、分析器等信息。
- 查询(Query): 在Elasticsearch中,查询是用于检索文档的一种方式。Elasticsearch支持丰富的查询DSL(领域特定语言),包括全文搜索、精确匹配、范围查询等。
- 分词(Tokenization): 分词是将文本拆分成单词(tokens)的过程。在 Elasticsearch 中,文本字段的值会被分词成一个个单词,这些单词被称为词项(terms)。分词器(Tokenizer)和过滤器(Filter)在此过程中起到关键作用,影响搜索和分析的效果。
- **倒排索引(Inverted Index):**在倒排索引中,索引的键是文档中的词项(terms),而值是包含该词项的文档列表。这种结构与传统数据库的索引相反,因此称为倒排索引。
假设有三个文档:
- 文档1包含词项 “红色” 和 “运动鞋”
- 文档2包含词项 “红色” 和 “T恤”
- 文档3包含词项 “篮球” 和 “运动鞋”
倒排索引可能如下所示:
"红色" -> [文档1, 文档2]
"运动鞋" -> [文档1, 文档3]
"T恤" -> [文档2]
"篮球" -> [文档3]
在这个例子中,每个词项都映射到包含它的文档列表。这使得Elasticsearch能够非常迅速地找到包含特定词项的文档,而不需要遍历整个文档集合。
那么为什么进行搜索的时候要使用ES呢,MySQL的模糊匹配不也是可以的么?
我们假设一个业务场景:构建一个电子商务平台,需要实现商品的搜索和推荐功能
业务场景
以下是用Elasticsearch和MySQL的处理
商品搜索:
- Elasticsearch: 商品搜索是一个关键的功能,用户需要能够通过关键字搜索商品,获取相关性最高的结果。Elasticsearch的全文搜索和分词功能使得在商品的标题、描述中进行模糊搜索。例如,用户搜索 “红色运动鞋” 可以返回标题或描述字段中包含这些关键词的商品。
- MySQL: 在传统关系型数据库中,可以使用 LIKE 操作进行模糊搜索。但相较于 Elasticsearch,MySQL在处理大量文本数据的全文搜索上性能可能较低。
在这个业务场景中,MySQL需要检索完数据库中的所有信息然后返回命中的数据,当数据量大到千万百万的时候,这种查询的效率无疑是非常低的,而使用Elasticsearch的倒排索引,相当于MySQL搜索方式的反面,根据关键词的分词找到对应的文档,然后直接返回命中的数据。
实时性需求:
- Elasticsearch: 商品信息更新后,可以几乎实时地反映在搜索结果中。这对于价格调整、库存变动等实时性要求较高的场景非常重要。
- MySQL: MySQL的实时性受到索引的影响,对于复杂的查询和大量数据,可能需要较长的时间才能完成索引更新。
推荐系统:
- Elasticsearch: 基于用户的搜索历史、购买记录等信息,可以利用 Elasticsearch 的聚合和分析功能实现个性化商品推荐。例如,给用户推荐与其搜索过的商品相关性较高的其他商品(ELK)。
- MySQL: 在传统数据库中,实现个性化推荐需要设计和维护复杂的关系表和算法,相较于 Elasticsearch 的聚合和分析功能,可能更为繁琐。
本文主要是一些对Elasticsearch的简单介绍,不涉及DSL教程,都是一些简单的Elasticsearch对索引和对文档的CRUD和集成Elasticsearch,上手比较简单