Elasticsearch 是一个基于 Apache Lucene 的全文搜索和分析引擎。Elasticsearch 使得对来自多个来源的数据执行数据聚合操作以及对存储的数据执行模糊搜索等非结构化查询变得更加容易。它以类似文档的格式存储数据,类似于 MongoDB 的做法。数据以 JSON 格式序列化。这为其添加了非关系性质,因此,它也可以用作 NoSQL/非关系数据库。典型的 Elasticsearch 文档如下所示:
{
"email":"xyz@gmail.com",
"dob":"04-11-1999",
"city":"beijing",
"country":"China",
"occupation":"Software Engineer",
}
- 它是分布式的,可水平扩展,因为可以在需要时将更多 Elasticsearch 实例添加到集群中,而不是增加运行 Elasticsearch 实例的一台机器的功能。
- 它是 RESTful 和以 API 为中心的,因此更易用。它的操作可以通过 RestFul API 通过 HTTP 轻松访问,因此可以无缝集成到任何应用程序中。此外,各种编程语言都有大量包装器可用,无需手动使用 API,并且大多数操作可以通过处理与引擎本身通信的库函数调用来访问。
- 通过使用 CRUD 操作——创建、读取、更新、删除——可以有效地对持久存储中存在的数据进行操作。这些类似于关系数据库实现的 CRUD,可以通过 RESTful API 中存在的 HTTP 接口执行。
我们可以在哪里使用 Elasticsearch?
Elasticsearch 非常适合 –
- 存储和操作非结构化或半结构化数据,这些数据的结构可能经常发生变化。由于无架构性质,添加新列不需要向表添加新列的开销。通过简单地将新列添加到索引的传入数据中,Elasticsearch 能够容纳新列并使其可用于进一步的操作。
- 全文搜索:通过使用每个文档的 TF-IDF 计数将搜索词与文档内容相关联,通过对每个文档进行搜索相关性排名,模糊搜索能够根据与所进行的搜索的相关性对文档进行排名。
- 通常将 Elasticsearch 用作不同系统生成的日志的存储和分析工具。Kibana 等聚合工具可用于根据收集的数据实时构建聚合和可视化。
- 它适用于数据的时间序列分析,因为它可以实时从传入数据中提取指标。
CI/CD 管道中的基础设施监控。
Elasticsearch 概念Elasticsearch 使用一个称为反向索引的概念。这个概念来自 Lucene 库(记住上面的 Apache Lucene)。该索引类似于书背面的术语,显示书中每个重要术语可能出现或讨论的页数。倒排索引可以更容易地根据查询中存在的关键字将查询解析到可能相关的特定文档,并通过限制要为该查询考虑的文档的搜索空间来加速文档检索过程。让我们来看看以下三个权力的游戏对话:
1.“Winter is coming.”
2.“A mind needs books as a sword needs a whetstone, if it is to keep its edge.”
3.“Every flight begins with a fall.”
4.“Words can accomplish what swords cannot.”
将这些对话中的每一个都视为一个文档,即每个文档的结构如下:
{
// 输入代码内容
“对话”:“......”
}
经过一些简单的文本处理:将文本小写并去除标点符号后,我们可以构建“倒排索引”,如下所示:
Term | Frequency | Documents |
---|
a | 4 | 2, 3 |
accomplish | 1 | 4 |
as | 1 | 2 |
begins | 1 | 3 |
books | 1 | 2 |
can | 1 | 4 |
cannot | 1 | 4 |
coming | 1 | 1 |
edge | 1 | 2 |
every | 1 | 3 |
fall | 1 | 3 |
flight | 1 | 3 |
if | 1 | 2 |
is | 2 | 1, 2 |
it | 1 | 2 |
its | 1 | 2 |
keep | 1 | 3 |
mind | 1 | 2 |
needs | 1 | 2 |
sword | 1 | 2 |
swords | 1 | 3 |
to | 1 | 2 |
what | 1 | 3 |
whetstone | 1 | 2 |
winter | 1 | 1 |
with | 1 | 3 |
words | 1 | 4 |
- 前两列构成所谓的Dictionary。这是 Elasticsearch 搜索搜索词以了解哪些文档可能与当前搜索相关的地方。
- 第三列也称为Postings。这将每个单独的术语与其可能出现的文档联系起来。
与 Elasticsearch 相关的几个常见术语如下:
- 集群:集群是一组运行 Elasticsearch 引擎的系统,它们参与并彼此密切对应以存储数据和解决查询。根据它们在集群中的角色,它们被进一步分类。
- 节点:节点是运行 Elasticsearch 运行时实例的 JVM 进程,可由集群中的其他机器或节点通过网络独立访问。
- 索引:Elasticsearch 中的索引类似于关系数据库中的表。
- 映射:每个索引都有一个与之关联的映射,它本质上是索引中每个单独文档可以保存的数据的模式定义。这可以为每个索引手动创建,也可以在将数据推送到索引时自动添加。
- 文档:一个 JSON 文档。在关系术语中,这将表示表中的一行。
- 分片:分片是可能属于也可能不属于同一索引的数据块。由于属于单个索引的数据可能会变得非常大,比如几百 GB 甚至几 TB,因此垂直增长存储是不可行的。相反,数据在逻辑上被分成存储在不同节点上的分片,这些分片分别对其中包含的数据进行操作。这允许水平缩放。
- 副本:集群中的每个分片都可以复制到集群中的一个或多个节点。这允许进行故障转移备份。万一其中一个节点出现故障或此时无法利用其资源,则始终可以使用具有数据的副本来处理数据。默认情况下,为每个分片创建一个副本,数量是可配置的。除了故障转移,副本的使用也提高了搜索性能。