Elasticsearch 初学者指南
人生在世,我们总是在追寻着什么。无论是追寻生命的意义,还是寻找城里最美味的墨西哥卷饼,我们都严重依赖搜索引擎来寻找答案。
您可能已经使用过 Yelp、Uber 或 Wikipedia 等具有强大搜索功能的应用程序。但您知道这些应用程序都是使用 Elasticsearch 构建的吗?
Elasticsearch 是一款免费开放的搜索和分析引擎,适用于所有类型的数据。它以速度和可扩展性著称。Elasticsearch 能够索引多种类型的内容,因此广泛应用于应用程序搜索、企业搜索、应用程序性能监控和安全分析等众多领域(引自Elastic)。
如果您是一名开发人员,希望实时、大规模地使用数据,那么 Elasticsearch 是一个很棒的工具。
Elasticsearch 被称为 Elastic Stack 的核心,它由 Beats、Logstash、Elasticsearch 和 Kibana 组成。
总之,Elastic Stack 允许您从任何来源、任何格式获取数据,然后实时搜索、分析和可视化(摘自Elastic)。本博客将特别关注 Elasticsearch。
阅读完本博客后,您将能够:
- 了解 Elastic Stack 的组件如何协同工作以实时搜索、分析和可视化数据
- 安装 Elasticsearch 和 Kibana 来运行查询
- 了解 Elasticsearch 的基本架构
- 讨论分片和复制如何提高 Elasticsearch 的可扩展性和可靠性
补充视频
如果你更喜欢通过观看视频来学习,我制作了一个视频来解释本博客中涵盖的概念。如果你想对某些概念有更深入的解释,请务必观看!
视频中涉及的主题:
- Elastic Stack 是什么?Elasticsearch 和 Kibana 的用例有哪些?5:16
- Elasticsearch 基本架构 14:53
- 什么是分片?18:21
- 什么是复制?23:07
- 动手实验:使用 Elasticsearch 和 Kibana 执行 CRUD 操作 25:03
- 问答 49:17
其他资源
掌握本博客中涵盖的概念后,通过阅读本博客学习如何使用 Elasticsearch 和 Kibana 执行 CRUD 操作!
Elastic Stack 的产品如何协同工作?
Elastic stack 由 Beats、Logstash、Elasticsearch 和 Kibana 组成。
理解这些产品如何协同工作的最佳方法是将它们置于实际项目中。这些组件通常会混合搭配,以满足您的特定用例。在本教程中,我们将介绍一个同时使用所有这些组件的场景。
想象一下,你是最热门户外装备电商网站的首席开发人员。你目前有一个连接到数据库的全栈应用程序。
数百万客户正在您的网站上搜索产品,但当前的架构难以跟上用户提交的搜索查询。
这就是 Elasticsearch 的用武之地。
您需要将 Elasticsearch 连接到您的应用。当用户在您的网站上发送搜索查询时,该请求会被发送到服务器。服务器随后会将搜索查询发送到 Elasticsearch。
Elasticsearch 将搜索结果发送回服务器,服务器处理信息并将结果发送回浏览器。
此时,您可能想知道我们如何将数据导入 Elasticsearch?
这就是 Beats 和 Logstash 发挥作用的地方。
图片来源:devops_core
Beats是数据采集器的集合。安装在你的服务器上后,它会收集数据并将其发送到 Logstash 或 Elasticsearch。
Logstash是一个数据处理管道。Logstash 接收的数据(例如电商订单和客户消息)会被处理为事件。这些事件会被解析、过滤和转换,然后发送到 Elasticsearch 进行数据存储。
在 中Elasticsearch,数据以文档的形式存储,文档是 JSON 对象中的信息单位。您可以使用 REST API 来查询这些文档。
我们稍后会深入研究 Elasticsearch。目前,我们先了解一下 Elasticsearch,它负责对海量数据进行搜索和分析。
如果我们不能将数据可视化并从中获得见解,那么所有对数据的搜索和分析都将毫无用处!
Kibana为 Elasticsearch 中存储的数据提供 Web 界面。它允许用户使用相同的 REST API 向 Elasticsearch 发送查询。这些查询可以解答诸如“每天有多少用户访问我们的网站?”或“上个月的收入是多少?”之类的问题。
通过 Kibana 仪表板,用户可以可视化查询结果并从数据中获得见解,如下所示!

图片来源:Elastic
现在我们已经了解了 Elastic Stack 的组件如何协同工作,让我们更深入地了解 Elasticsearch!
首先,我们将安装 Elasticsearch 和 Kibana 来帮助我们可视化和巩固本教程中涵盖的概念。
安装 Elasticsearch
为了简洁起见,我将只介绍 Windows 系统的安装说明。不过不用担心!macs/linux 系统的安装步骤已在本博客中分享。
注意!
如果您想在本地运行 Elasticsearch 和 Kibana v8+,具体步骤与本博客中介绍的有所不同。点击此处查看如何运行 v8+ 的博客!
步骤1:下载Elasticsearch
转到下载链接。
在用绿色框突出显示的区域中,选择适合您的操作系统的下载选项。
您将看到 elasticsearch 已下载(橙色框)。
向下滚动页面,您将看到安装步骤。我们将使用这些步骤中指定的命令来测试 Elasticsearch 服务器是否运行顺畅。
步骤 2:重新定位下载的 Elasticsearch 并解压 Elasticsearch
将 Elasticsearch 重新定位到哪里由您决定,但为了本教程,我在 Windows(C:)驱动器中创建了一个名为 Elastic_Stack 的文件夹。
将下载的 Elasticsearch 移动到 Elastic_Stack 文件夹。
右键单击 Elasticsearch,弹出选项,然后点击extract all“选项”。下载 Elasticsearch 解压后,双击该文件夹。您将在屏幕上看到以下内容。
双击该文件夹。
点击 bin 文件夹(红色框)。
点击绿色方框高亮的区域。它会显示 bin 文件夹的文件路径。复制此地址。我们将在下一步中使用它。
步骤3:启动Elasticsearch服务器并确保一切正常运行
在 Windows 上搜索命令提示符应用程序(紫色框),然后单击run as administrator选项(红色框)。
在命令提示符应用程序终端中,通过提供 bin 文件夹的文件路径切换到 bin 目录 (cd)。这是您在上一步中复制的文件路径。
#In command prompt terminal
cd filepath to bin folder in Elasticsearch
红色框突出显示了我们用来更改 bin 目录的命令。
当您按下回车键时,您将看到已经进入 bin 目录(蓝色框)。
在终端中运行以下命令。如果您在非 Windows 操作系统上运行,请elasticsearch改为在终端中运行。
#In command prompt terminal
elasticsearch.bat
在看到 Elasticsearch 服务器运行之前,您会看到光标闪烁一段时间!
您将看到 Elasticsearch 服务器在本地主机的端口 9200(红色框)上运行。
让我们快速回顾一下。当用户(客户端)向服务器发送请求时,服务器会向 Elasticsearch 服务器发送搜索查询。我们使用 REST API 来查询文档,并将该查询发送到端点http://localhost:9200。
我们将使用 cURL 命令行工具来检查 Elasticsearch 服务器是否收到请求。
打开一个新的命令提示符窗口(红色框)。
在新的终端中,运行以下命令。
#In new command prompt terminal
curl http://localhost:9200
当你运行命令(白色框)时,你将在终端(蓝色框)中看到以下 JSON 对象。这意味着一切正常,Elasticsearch 已成功安装。
保持这些终端打开以保持 Elasticsearch 服务器运行。
安装 Kibana
安装 Kibana 与安装 Elasticsearch 非常相似。
步骤 1:下载 Kibana
Kibana 是 Elasticsearch 的 Web 界面。但它附带了与 Elasticsearch 通信的后端服务器。
转到下载链接。
在用红色框突出显示的区域中,选择适合您的操作系统的下载选项。
您将看到 Kibana 已下载。
向下滚动页面,您将看到安装步骤。我们将使用这些步骤中指定的命令来测试 Kibana 服务器是否正常运行。
步骤 2:重新定位下载的 Kibana 并解压 Kibana
将下载的 Kibana 移动到 Elastic_Stack 文件夹。
右键单击 Kibana 以显示选项,然后单击extract all选项。Kibana 解压后,双击该文件夹。
点击 bin 文件夹(红色框)。
点击绿色方框高亮的区域。它会显示 bin 文件夹的文件路径。复制此地址。我们将在下一步中使用它。
步骤 3:运行 Kibana 并确保一切正常运行
首先,返回运行 Elasticsearch 服务器的命令提示符窗口。确保它仍在运行,并且没有显示任何错误消息。
打开一个新的命令提示符窗口。
在命令提示符应用程序终端中,通过提供 bin 文件夹的文件路径,切换到 Kibana 的 bin 目录 (cd)。这是您在上一步中从 bin 文件夹复制的路径。
#In command prompt terminal
cd filepath to bin folder in Kibana
该命令已用红色框突出显示。
当您按下回车键时,您将看到已经进入 bin 目录(蓝色框)。
在终端中运行以下命令。如果您在非 Windows 操作系统上运行,请kibana改为在终端中运行。
#In command prompt terminal
kibana.bat
在看到 Kibana 运行之前,您会看到光标闪烁一段时间!
打开浏览器并转到http://localhost:5601。
您将看到浏览器上显示以下内容。
故障排除
If you are having trouble getting Kibana to work, try restarting your Elasticsearch server. Go to the command prompt terminal used for your Elasticserach server. Press `control + c`. Then, run elasticsearch.bat in the same terminal.
Go back to your command prompt terminal for Kibana. Run `control + c` in the command prompt terminal. Then, run kibana.bat in the terminal. Go to http://localhost:5601 on your browser.
好吧,让我们回到 Kibana 浏览器。
点击menu选项(红色框)以显示下拉菜单。向下滚动到管理部分,然后点击Dev Tools选项(绿色框)。
该控制台允许我们轻松地向 Elasticsearch 发送查询。
好了,安装完毕后,让我们深入研究 Elasticsearch 的基本架构!我们将使用 Kibana 来深入了解 Elasticsearch 的内部结构。
Elasticsearch的基本架构
Elasticsearch 是一款功能强大的搜索和分析引擎,以其分布式特性、速度和可扩展性而闻名。这得益于其独特的架构。
我们刚刚下载并运行了一个 Elasticsearch 服务器。我们几乎不知道我们正在启动一个节点(蓝色圆圈)!节点node是一个正在运行的 Elasticsearch 实例,用于存储数据。它有一个唯一的 ID 和一个名称。
每个节点都属于一个cluster,它是一组连接在一起的节点的集合。当我们启动一个节点时,一个集群就会自动形成(粉色框)。
您可以在集群中添加一个或多个节点。这些节点分布在不同的机器上。默认情况下,每个节点会被分配以下所有角色:主节点、数据节点、采集节点和机器学习节点(如果可用)。您可以配置这些角色,并为特定节点分配特定的角色。
集群中的每个节点都可以处理来自客户端的 HTTP 请求以及节点之间的通信。所有节点都了解同一集群内的其他节点,并且可以将 HTTP 请求转发到专门用于处理该请求的节点。
数据在节点内如何存储?
Elasticsearch 中存储的数据的基本单位称为文档。Document是一个 JSON 对象,其中包含您想要存储在 Elasticsearch 中的任何数据。
例如,假设您正在开发一款应用,帮助用户找到他们所在地区最好的餐车。为了构建这款应用,您需要存储餐车的相关数据。
存储一辆食品卡车数据的文档如下所示。
{
"name": Pho King Rapidos,
"cuisine": Vietnamese and Mexican fusion
}
想象一下,如果我们拥有数百万辆餐车的数据,该如何快速搜索数据,找到我们想要的餐车呢?
搜索数据与在杂货店搜索食品非常相似。如果商店里的所有食品都被分类到特定的货架上(例如新鲜农产品、肉类、乳制品、调味品等),您的搜索效率会更高。
文档的组织方式类似。每个文档都被分组到一个索引中。索引index是一组具有相似特征且彼此逻辑相关的文档的集合,就像杂货店的货架一样。
集群包含多个节点。在节点内,相关文档按索引分组。
就像我们去农产品货架寻找苹果一样,我们在搜索文档时会根据索引运行搜索查询。
好吧,让我们深入了解 Elasticsearch,看看如何获取有关我们刚刚创建的节点和集群的信息。
Elasticsearch 集群公开了一个用于接收 HTTP 请求的 REST API。我们可以使用任何 HTTP 客户端(例如 Postman 或 cURL)访问此 REST API,但我们将使用 Kibana 开发工具来执行此操作。
打开你的 Kibana 开发工具。你应该在屏幕上看到以下内容。
我们将首先检查集群的健康状态。
删除灰色突出显示区域中的内容,以便我们可以编写自己的查询。
查询的语法非常简单。通过指定 HTTP 方法(GET、POST、PUT、DELETE)来发起查询。然后,我们指定要访问的 API 以及想要完成的操作(命令)。
在本例中,我们想要检索(GET)集群的健康状态。我们指定要访问集群 API,并获取有关其健康状况的信息。
所以我们的查询应该是这样的:
GET /_cluster/health
将查询复制并粘贴到用红色框突出显示的区域中。
单击查询以确保已选中。单击橙色框突出显示的箭头即可运行查询。
您将看到返回了一个 JSON 对象(绿色框)。您可以看到集群名称默认设置为 elasticsearch,集群状态设置为绿色。
这意味着我们的集群是健康的!
让我们获取集群中的节点列表。
为了获取这些信息,我们使用 _cat API。查询语法与我们刚刚发送的查询非常相似。
我们将向 _cat API 发送 GET 请求,并使用命令 nodes?v 来获取集群中的节点列表。
您的查询将如下所示:
GET /_cat/nodes?v
将查询复制并粘贴到开发工具中。选择查询,然后点击箭头发送查询。
您将看到屏幕上显示了我们拥有的单个节点的基本信息。其中包括有关节点的 IP 地址、名称、角色以及一些性能指标的信息。
太棒了!看来我们的节点和集群已经成功创建了。
让我们为 food_trucks 创建一个索引。
您可以通过指定 PUT 方法后跟索引名称来创建索引。
在开发工具中运行以下查询。
PUT food_trucks
您将看到返回一个 JSON 对象。它表明名为 food_trucks 的索引已成功创建。
您还将看到 shards_acknowledged 的值已设置为 true。我们稍后会介绍这一点!
有了对 Elasticsearch 架构的基本了解,我们现在可以了解哪些因素使得 Elasticsearch 如此可扩展和可靠!
了解 Elasticsearch 可扩展性和可靠性背后的因素
什么是分片?
在上一步中,创建索引时,我们看到 shards_acknowledged 值已设置为 true。那么,分片到底是什么呢?
之前我提到过,相关文档会被分组到索引中。索引实际上并不存储文档,而是一个虚拟的东西,用来跟踪文档的存储位置。
您在磁盘上找不到索引。磁盘上实际存在的是分片!分片是 Elasticsearch 中存储数据的地方。搜索也是在这里运行的!
创建索引时,默认会自带一个分片。您也可以配置创建包含多个分片的索引,这些分片分布在不同的节点上。
假设我们想在名为“Food Truck Index”的索引中存储 600K 份有关食品卡车的文档。
我们的集群中有三个节点,每个节点可容纳 20 万个文档。创建餐车索引时,默认会附带一个分片。该分片分配给节点 1。
请记住,分片是存储数据的地方。分片可容纳的文档数量取决于节点的容量。
我们有三个节点,每个节点只能容纳 20 万个文档。但是,60 万个文档的整个索引根本无法放入任何一个节点!如果我们能将这些文档分成更小的块,并将它们存储在这些节点上就好了……
嗯,这就是分片!
为了实现这一点,我们在索引中添加了两个额外的分片,并将这些分片分布在这些节点上。然后,我们在每个分片上存储 20 万个文档。这些分片加起来,现在能够存储 60 万个餐车文档!
通过将文档划分成更小的块,并将它们存储在分布在各个节点的分片中,我们能够存储 60 万个文档。尽管我们没有一个节点能够存储所有这些数据,但我们仍然做到了!这就是分片的魅力所在!
分片使 Elasticsearch 能够适应不断增长的数据量或需求。
因此,如果我们的餐车应用程序成功运行,并且我们的用户群以惊人的速度增长,我们就不必担心数据量的增加。我们可以简单地添加更多节点,并更改您正在使用的索引的分片数量!
什么是复制?
我们的餐车应用发展势头强劲。令人担忧的是,其中一个节点宕机了,数据彻底丢失。
你能想象如果我们没有备用机制来处理这样的事情,这将是一场怎样的噩梦吗?
感谢上帝,我们有复制品!
Replication创建分片副本,并将副本保存在不同的节点上。如果一个节点宕机,存储在其他节点上的副本将承担起责任,像什么都没发生一样处理请求。
Elasticsearch 会自动复制分片,无需我们进行任何配置。它会为索引中的每个分片创建一个副本(副本分片)。
还记得我们之前创建了一个名为 food_trucks 的索引吗?让我们使用 Kibana 获取有关索引的更多信息。
转到开发工具并运行以下查询。
GET /_cat/indices?v
如果你查看该列,你会看到列 pri 和 rep(红色框)。它们分别代表主分片 (pri) 和副本分片 (rep)。
让我们检查一下绿色框突出显示的索引 food_trucks。您将看到,在创建索引时,已自动创建了主分片和副本分片!
Replica shard是主分片的完全一样的副本。其功能与主分片完全相同。
正所谓“事不宜迟”,副本分片绝不会与主分片存储在同一个节点上。主分片和副本分片按如下所示的方式分布在各个节点上。
即使某个节点发生故障,您也可以放心,因为存储在另一个节点中的副本分片将会弥补不足,就像什么都没发生过一样!
如您所见,分片和复制有助于提高 Elasticsearch 的可扩展性和可靠性。
好了,我们所有的最终目标都达成了!你们走到今天这一步,值得掌声和长假的到来。
现在您已经扎实掌握了 Elasticsearch 的重要概念,可以开始探索更高级的技能,例如 CRUD 操作、映射、分析和高级查询。快来探索 Elasticsearch,看看您能用它做些什么吧!




































