Elasticsearch是基于Apache Lucene的全文本搜索和分析引擎。 Elasticsearch使对来自多个源的数据执行数据聚合操作以及对存储的数据执行非结构化查询(例如模糊搜索)变得更加容易。
它以类似于文档的格式存储数据,类似于MongoDB的方式。数据以JSON格式序列化。这为其添加了非关系性质,因此,它也可以用作NoSQL /非关系数据库。
典型的Elasticsearch文档如下所示:
{
"first_name": "Divij",
"last_name":"Sehgal",
"email":"xyz@gmail.com",
"dob":"04-11-1995",
"city":"Mumbai",
"state":"Maharashtra",
"country":"India",
"occupation":"Software Engineer",
}
- 它是分布式的,水平可伸缩的,因为可以在需要时将更多Elasticsearch实例添加到集群中,而不是增加一台运行Elasticsearch实例的计算机的功能。
- 它是RESTful且以API为中心,因此使其更加可用。可以通过RestFul API通过HTTP轻松访问其操作,因此可以将其无缝集成到任何应用程序中。此外,可以使用各种编程语言提供大量包装器,从而无需手动使用API,并且大多数操作都可以通过处理与引擎本身通信的库函数调用来访问。
- 通过使用CRUD操作- Visual C reate,R EAD,U PDATE,d elete -有可能存在于永久存储器中的数据有效地操作。这些类似于通过关系数据库实现的CRUD,并且可以通过RESTful API中存在的HTTP接口执行。
我们在哪里使用Elasticsearch?
Elasticsearch非常适合–
- 存储和操作非结构化或半结构化数据,这些数据可能经常会发生结构变化。由于无模式的性质,添加新列不需要向表中添加新列的开销。通过简单地将新列添加到索引的传入数据中,Elasticsearch可以容纳新列并将其用于进一步的操作。
- 全文搜索:通过使用每个文档的TF-IDF计数将搜索词与文档内容相关联,从而对每个文档与搜索相关性进行排名,模糊搜索能够根据与搜索的相关性对文档进行排名。
- 经常将Elasticsearch用作不同系统生成的日志的存储和分析工具。聚合工具(例如Kibana)可用于根据收集的数据实时构建聚合和可视化。
- 它可以对数据进行时间序列分析,效果很好,因为它可以实时从传入数据中提取指标。
- CI / CD管道中的基础结构监视。
Elasticsearch概念
Elasticsearch研究一种称为反向索引的概念。这个概念来自Lucene库(请记住上面的Apache Lucene)。
该索引类似于一本书后面的术语,该术语显示了可以显示或讨论该书中每个重要术语的页面。倒排索引使基于查询中存在的关键字更容易将查询解析为可能与之相关的特定文档,并通过限制要为该查询考虑的文档的搜索空间来加快文档检索过程。
让我们进行以下三个《权力的游戏》对话:
- “冬天来了。”
- “要想保持优势,头脑需要书籍,就像剑需要磨刀石。”
- “每次飞行都是从坠落开始的。”
- “言语可以成就剑所不能做到的。”
将这些对话中的每一个都视为一个文档,即每个文档的结构如下:
{
"dialogue": "....."
}
经过一些简单的文本处理:在对文本进行小写并删除标点符号之后,我们可以如下构建“倒排索引”:
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搜索搜索词,以了解哪些文档可能与当前搜索相关。
- 第三列也称为“过帐” 。这会将每个单独的术语与可能存在的文档链接起来。
很少有与Elasticsearch相关的通用术语如下:
- 集群:集群是一组运行Elasticsearch引擎的系统,它们相互参与并相互紧密地操作以存储数据并解决查询。根据它们在集群中的作用,对它们进行进一步分类。
- 节点:节点是运行Elasticsearch运行时实例的JVM进程,可由集群中的其他机器或节点通过网络独立访问。
- 索引:Elasticsearch中的索引类似于关系数据库中的表。
- 映射:每个索引都有一个与之关联的映射,本质上是索引中每个文档可以保存的数据的架构定义。可以为每个索引手动创建,也可以在将数据推送到索引时自动添加。
- Document :一个JSON文档。用关系术语来说,这将代表表中的单个行。
- 分片:分片是可能属于或可能不属于同一索引的数据块。由于属于单个索引的数据可能会变得非常大,例如数百GB甚至几TB,因此垂直扩展存储是不可行的。取而代之的是,数据在逻辑上分为存储在不同节点上的碎片,这些碎片分别对其中包含的数据进行操作。这允许水平缩放。
- 副本:集群中的每个分片都可以复制到集群中的一个或多个节点。这样可以进行故障转移备份。万一其中一个节点出现故障或当前无法利用其资源,则具有数据的副本始终可用于处理数据。默认情况下,将为每个分片创建一个副本,并且该副本数是可配置的。除了故障转移外,使用副本还可以提高搜索性能。