ElasticSearch Java API

2024年9月10日 | 阅读 6 分钟

Elasticsearch 是一个基于 Apache Lucene 的全文本搜索和分析引擎。Elasticsearch 使跨不同来源的数据执行数据聚合以及对存储数据执行非结构化查询(如模糊搜索)变得更加容易。

它以文档形式存储数据,类似于 MongoDB 的工作方式。数据以 JSON 格式序列化。这使其具有非关系性,因此也可以用作 NoSQL/非关系型数据库。

示例

  1. 它是分布式的,并且可以水平扩展,因为可以根据需要向集群添加更多 Elasticsearch 实例,而不是增加运行 Elasticsearch 实例的一台机器的容量。
  2. 它是 RESTful 的,并且 API 是驱动的,因此更易于使用。可以通过 HTTP 通过 RESTful API 轻松访问其操作,因此可以无缝集成到任何应用程序中。此外,还有多种不同编程语言的客户端库,无需手动使用 API,并且可以通过处理与实际引擎通信的库函数调用来访问大多数操作。
  3. 使用 CURD 操作 - 创建、读取、更新、删除 - 可以有效地操作持久存储中的数据。这些类似于关系型数据库实现的 CURD,并且可以通过 RESTful API 中存在的 HTTP 接口执行。

ElasticSearch 的工作原理

在进行任何操作之前,数据必须被索引。用户可以对他们的数据运行复杂的查询,并在数据被索引后使用聚合来检索复杂的数据摘要。Elasticsearch 将数据存储为 JSON 文档,并使用一种称为倒排索引的数据结构,该结构旨在实现非常快速的全文本搜索。

倒排索引记录了出现在任何文档中的每个独特单词,并识别出每个单词出现的每个文档。为了更好地理解,我们将把 Elasticsearch 分解成几个主题。

  1. 映射(Mappings): 映射是定义索引及其字段的方式。就像在 RDBMS 中定义表模式一样。
  2. 分析(Analysis): 文本分析是将非结构化文本(如电子邮件正文或产品描述)转换为优化搜索的结构化格式的过程。Elasticsearch 在索引或搜索文本字段时会执行文本分析。这是我们在映射中定义的,是搜索引擎的关键因素。
    ElasticSearch 对所有文本分析使用标准分析器。标准分析器为您提供开箱即用的对大多数常见语言和用例的支持。如果您决定使用标准分析器,则无需进一步配置。您也可以创建自己的自定义分析器。
  3. 搜索方法: 您可以对 Elasticsearch 应用多种类型的查询。通过这些,您将获得相应的搜索结果。这里我将给出一个基本的查询示例。一个匹配所有文档的最简单的查询。
  4. 查询
    1. 复合查询(Compound queries): 复合查询会包装其他复合查询或叶子查询,以合并它们的结果和分数,更改它们的行为,或从查询上下文转换为过滤上下文。
      用于合并多个叶子或复合查询语句的默认查询,例如 must、should、must_not 或 filter 子句。must 和 should 子句的分数会被合并。
    2. 全文查询(Full-text queries): 全文查询使您能够搜索已分析的文本字段,如电子邮件正文。查询字符串将使用在索引时应用于该字段的同一分析器进行处理。它将分析您的输入。如果给定的数据不精确,您仍会得到结果。
    3. 关联查询(Joining queries): 在 Elasticsearch 这样的分布式系统中执行完整的 SQL 式 JOIN 是成本高昂的。为此,Elasticsearch 提供了两种旨在水平扩展的 JOIN 类型。
      • has_child 和 has_parent 查询
      • Nested query(嵌套查询)
    4. 特定查询(Specific queries): 此类别包含不属于其他类别的查询,找到性质相似的文档,以及粘性查询。还有很多其他类型的查询,请查看其文档。
    5. 术语级查询(Term-level queries): 您可以使用术语级查询来查找基于结构化数据中精确值的文档。结构化数据的示例包括日期范围、IP 地址、价格或产品 ID。
      与全文查询不同,术语级查询不会分析搜索词。相反,术语级查询会匹配存储在字段中的精确术语。它会找到输入的精确匹配,而在全文查询中,首先会对其进行分析,然后进行搜索,这是术语级查询和全文查询之间的一个重要区别。
  5. 聚合和过滤器(Aggregation and Filters): 在过滤器上下文中,查询语句回答“这个文档是否匹配这个查询子句?”答案是简单的“是”或“否”——不计算分数。过滤器上下文通常用于过滤结构化信息。
    经常使用的过滤器会被 Elasticsearch 自动缓存以加快执行速度。每当将查询子句传递到 filter 子句(例如 bool 查询中的 filter 或 must_not 子句,constant_score 查询中的 filter 子句,或 filter 聚合)时,过滤器上下文都会处于活动状态。聚合更像是 RDBMS 中的所有聚合。您将使用 Avg、Aggregate 和许多复杂查询的数据洞察。

ElasticSearch 的用途

  1. 处理和存储无组织或半组织化的数据,这些数据可能经常更改结构。由于其无模式的特性,添加新字段不需要修改表来添加新字段。只需向索引添加新字段即可处理新字段,并使其可供进一步操作。
  2. 全文本搜索:通过使用 TF-IDF 计算每篇文档与搜索词的关联度,模糊搜索可以根据与所创建查询的相关性对文档进行排名。
  3. 通常使用 Elasticsearch 作为分散式系统的日志存储和分析工具。Kibana 等可视化工具可用于从收集的数据中实时构建聚合和可视化。
  4. 它非常适合对数据进行时间序列分析,因为它可以实时从传入数据中提取指标。
  5. 用于监控 CI/CD 流水线。

与 ElasticSearch 相关的常见术语

  1. 集群(Cluster): 集群是一组运行 Elasticsearch 引擎的系统,它们近乎协作地存储信息和解决查询。这些系统也根据它们在集群中的角色进行组织。
  2. 节点(Node): 节点是一个运行 Elasticsearch 运行时实例的 JVM 进程,可以通过网络独立访问其他机器或集群中的节点。
  3. 索引(Index): Elasticsearch 中的索引类似于关系型数据库中的表。
  4. 映射(Mapping): 每个索引都有一个相关的映射,基本上是每个文档可以包含的数据的结构定义。可以为每个索引手动创建映射,也可以在数据推送到索引时自动添加。
  5. 文档(Document): 一个 JSON 文档。在关系型数据库的术语中,这代表表中的一个元组。
  6. 分片(Shard): 分片是属于同一索引的数据块。由于属于单个索引的数据可能会非常大,例如几百 GB 甚至几 TB,因此无法垂直扩展存储。因此,数据被水平分割成存储在不同节点上的分片,这些节点独立处理它们包含的数据。这允许水平扩展。
  7. 副本(Replicas): 集群中的每个分片都可以复制到一个或多个节点。这提供了故障转移备份。如果其中一个节点发生故障或暂时无法使用其资源,具有该数据的副本始终可用以处理数据。默认情况下,每个分片会创建一个副本,并且数量是可配置的。除了故障转移,副本的使用还可以提高搜索性能。