首页 > 编程笔记 > 通用技能 阅读:6

Elasticsearch是什么(非常详细)

Elasticsearch 是一个基于 Lucene 构建的开源、分布式、RESTful 接口的全文搜索引擎。

Elasticsearch 使用倒排索引技术,将文档中的词语进行分词,并将分出的单个词语统一放入一个分词库,在搜索时,根据关键字去分词库中搜索,从而快速找到相关信息, Elasticsearch 能够进行横向扩展,可以在极短的时间内存储、搜索和分析大量的数据。

下图展示了是数据库网站 DB-Engines 在 2023 年 8 月发布的数据库流行度排行榜。


图 1 DB-Engines 发布的数据库流行度排行榜

从中可以看出,Elasticsearch 位于前 10 名,其受欢迎的程度可见一斑。

Elasticsearch发展历程

许多年前,一个叫沙伊·巴农(Shay Banon)的年轻人想为正在学习厨艺的新婚妻子编写一款菜谱搜索软件。在开发过程中,他发现搜索引擎库 Lucene 不仅使用门槛高,还有许多重复性工作,因此决定在 Lucene 的基础上封装一个简单易用的搜索应用库,并将其命名为 Compress。Elasticsearch 的前身就在这样浪漫的机缘下诞生了。

之后,Shay Banon 沙伊·巴农找到了一份工作,工作内容涉及大量的高并发分布式应用场景。于是,他决定重写 Compress,引入了分布式架构,并将 Compress 更名为 Elasticsearch。Elasticsearch 的第一个版本发布于 2010 年 5 月,发布后引发强烈反响。

Elasticsearch 在 GitHub 上发布后,使用量骤增,并很快有了自己的社区。没过多久,社区中的 Steven Schuurman、Uri Boness、Simon Willnauer 与 Shay Banon一起成立了搜索公司 Elasticsearch Inc.。

在 Elasticsearch Inc.成立前后,另外两个开源项目也正在快速发展:
由于作者间对彼此产品比较熟悉,因此他们决定合作发展,最终形成了 Elastic Stack 的经典技术栈 ELK:Elasticsearch, Logstash, Kibana。

从此以后,Elasticsearch 迅速发展,增加了许多新功能和特性。Elasticsearch  主要版本的发布时间如下图所示。


图 2 Elasticsearch 主要版本的发布时间

Elasticsearch的核心特点

1) Elasticsearch对复杂分布式机制的透明隐藏特性

Elasticsearch 不仅是一个开源的搜索引擎,同时也是一套分布式的系统。分布式是为了应对大数据量。

对于使用者来说,Elasticsearch 隐藏了复杂的分布式机制,使分布式机制对读者具有透明性:

2) Elasticsearch的搜索与分析功能

Elasticsearch 提供了强大的搜索与分析功能,用户可以使用不同的查询语言进行(高级)搜索,并对搜索结果进行聚合、排序、过滤等处理。

同时,Elasticsearch 还支持复杂的数据分析和统计功能,可以帮助用户从海量数据中发现有价值的信息。

3) Elasticsearch的可伸缩与可用性

分布式架构使 Elasticsearch 具有良好的可伸缩性和高可用性。用户可以根据需求来水平扩展集群,并通过复制和故障转移机制来提高系统的稳定性和容错性。

Elasticsearch基础概念

1) 集群

一个集群(Cluster)由一个唯一的名称进行标识,其名默认为“elasticsearch”。

集群名称非常重要,具有相同集群名称的节点才会组成一个集群。集群名称可以在配置文件中来指定。

2) 节点

节点(Node),即一个 Elasticsearch 实例。节点也有自己的名称,在启动时默认以一个随机的 UUID 的前 7 个字符作为自己的名称。用户也可以为节点指定名称。

节点通过集群名称在网络中发现同伴,并组成集群。一个节点也可以是一个集群。

节点可以分为以下 3 类:

3) 索引

Elasticsearch 数据管理的顶层单位叫作索引(Index),它的概念相当于关系数据库中数据库的概念。

每个索引有唯一的名称,用户通过这个名称来操作对应索引。每个索引的名称必须是小写字母。一个索引是一个文档的集合。一个集群中可以有多个索引。

4) 类型

文档可以分组,比如 employee 文档可以按部门分组,也可以按职位分组。这种分组叫作类型,它是虚拟的逻辑分组,用于过滤类型,这类似于关系数据库中的数据表。

5) 文档

索引中单条记录称为文档(Document)。许多条文档构成一个索引。文档使用 JSON 格式来表示。同一个索引中文档的结构不要求保持相同,但我们建议保持相同,因为这样有利于提高搜索效率。

6) 分片

创建一个索引时可以指定索引分成多少个分片进行存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。

分片的优点是支持容量的水平切分/扩展,支持在多个分片上进行分布式的、并行的操作,从而提高系统的性能。

当查询的索引分布在多个分片上时,Elasticsearch 会把查询请求发送给每个相关的分片,并将这些分片的查询结果组合在一起。而应用程序并不知道分片的存在,即这个过程对用户来说是透明的。

Elasticsearch基本操作

首先从 Elasticsearch 官方网站下载 Elasticsearch 安装包,然后按照官方文档提供的步骤进行安装和配置。

安装完成后,使用命令行进入 Elasticsearch 安装目录的 bin 文件夹,执行以下命令来启动 Elasticsearch 服务。
./elasticsearch

1) 创建索引

在 Elasticsearch 中,数据存储在索引中,可以使用 RestFUL API 或者 Elasticsearch 的客户端库来创建索引。

以下是使用 curl 命令创建名为 “my_index”的索引的示例:
curl -X PUT "localhost:9200/my_index"

2) 添加文档

在索引中添加文档,文档采用 JSON 格式来表示。以下是向“my_index” 索引中添加一个文档的示例:
curl -X POST "localhost:9200/my_index/_doc" -H "Content-Type:application/json" -d '
{
    "title": "Elasticsearch Example",
    "content": "This is an example document for Elasticsearch.}'

3) 搜索文档

以下是搜索“my_index”索引中标题包含“Elasticsearch”的文档的示例:
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type:application/json"
   -d '
{
    "query": {
        "match": {
            "title": "Elasticsearch"
        }
    }
}'

4) 聚合数据

Elasticsearch 提供了强大的聚合功能,可以对数据进行分组、计数、计算平均值等处理。

以下是一个示例,演示“my_index”索引中数据的聚合计算:
curl -X GET "localhost:9200/my_index/_search" -H "Content-Type:application/json"
   -d '
{
    "aggs": {
        "avg_price": {
            "avg": {
                "field": "price"
            }
        }
    }
}'

相关文章