前言
随着信息时代的到来,搜索引擎成为人们获取信息的重要工具。而 Elasticsearch 作为一个开源、分布式的搜索引擎,具备强大的搜索和分析功能,广泛应用于各种大规模数据的存储和搜索场景。本文将介绍 Elasticsearch 的基本概念、索引的使用方法和场景以及注意事项,帮助您快速入门。
什么是Elasticsearch?
Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,具备高效的全文搜索、实时数据分析和数据可视化等功能。它采用倒排索引的方式来存储和搜索数据,能够快速响应用户的搜索请求,并支持水平扩展。
安装
- 推荐从官网下载 https://www.elastic.co/cn/downloads/enterprise-search 选择对应的系统安装包
- 下载后解压安装包,进入目录内执行
./bin/elasticsearch
命令,Elasticsearch将在默认端口 9200 上启动 - 执行
curl http://localhost:9200
可看到版本信息,说明安装成功并且运行起来了
Elasticsearch 核心概念
了解以下几个概念对于理解和使用Elasticsearch是很重要的:
- 索引(Index):索引是一种逻辑上的概念,类似于数据库中的表。它是对具有相似特征的文档的逻辑分组。每个索引具有唯一的名称,用于在Elasticsearch中存储、搜索和聚合数据。
- 文档(Document):文档是Elasticsearch中的基本数据单元。它是以JSON格式表示的结构化数据对象。文档可以是任何类型的数据,例如产品信息、用户记录、日志条目等。每个文档在索引中具有唯一的ID,用于标识和检索它。
- 字段(Field):字段是文档中的具体数据项。它是由字段名称和相应的值组成。字段可以是各种类型,如字符串、数字、日期、布尔值等。在Elasticsearch中,字段被动态映射为特定类型,也可以手动指定映射。
- 映射(Mapping):映射定义了索引中文档的结构和字段的类型。它定义了字段的名称、数据类型、索引设置和分析器等信息。映射允许Elasticsearch根据指定的规则对文本数据进行索引和搜索。
- 分片和副本(Shards and Replicas):Elasticsearch将索引分为多个分片,每个分片是索引的一个子集,包含了索引的一部分数据。分片允许索引在集群中进行水平扩展和并行处理。此外,每个分片都可以有一个或多个副本,用于提供高可用性和故障恢复能力。
- 查询(Query):查询是指在索引中搜索和检索文档的操作。Elasticsearch提供了丰富的查询功能,包括全文搜索、精确匹配、范围查询、聚合查询等。您可以使用查询DSL(Domain Specific Language)构建复杂的查询。
- 聚合(Aggregation):聚合是对文档进行分组、过滤和计算的操作。它可以用于生成统计信息、分析数据分布、执行数据分桶等。聚合可以根据各种条件对文档进行分类,并生成汇总结果。
- 集群(Cluster):集群是由多个Elasticsearch节点组成的分布式环境。节点可以是主节点(Master Node)、数据节点(Data Node)或协调节点(Coordinator Node)。集群提供了高可用性、负载均衡和数据复制等功能。
- 分词(Tokenization):分词是将文本数据拆分为有意义的单词(词条)的过程。在Elasticsearch中,当文档被索引时,文本字段会被分析器分词成一系列词条,以便进行全文搜索和查询。
- 分析器(Analyzer):分析器是由字符过滤器(Character Filters)、分词器(Tokenizer)和词项过滤器(Token Filters)组成的处理链。它定义了在索引和搜索期间如何对文本进行处理和分词。
- 倒排索引(Inverted Index):倒排索引是Elasticsearch中用于实现快速搜索的核心数据结构。它通过将每个词条映射到包含该词条的文档中,实现了从词条到文档的快速反向查找。
- 路由(Routing):路由是决定文档将存储在哪个分片中的过程。Elasticsearch使用文档的ID和路由算法来确定文档应该被分配到哪个分片上。
- 搜索建议(Search Suggestion):搜索建议是一种在用户输入搜索查询时提供相关建议和自动完成的功能。Elasticsearch提供了搜索建议的功能,以提高用户体验和搜索结果的准确性。
- 实时搜索(Real-time Search):实时搜索是指在文档被索引后,能够立即进行搜索并返回最新结果的能力。Elasticsearch支持实时搜索,使您能够实时监测和检索最新的数据。
- 客户端库(Client Libraries):Elasticsearch提供了多种编程语言的官方客户端库,使开发人员可以轻松与Elasticsearch进行交互和集成。这些客户端库提供了与Elasticsearch的API进行通信的便捷方法。
以上是一些关键的 Elasticsearch 概念,它们涵盖了索引、文档、查询、聚合等核心功能和机制。了解这些概念将有助于您更好地理解和使用 Elasticsearch ,并能够更高效地处理数据和搜索需求。
索引和文档的关系
在 Elasticsearch 中,索引和文档是密切相关的概念,它们构成了数据存储和检索的基本单位。
- 索引: 索引是一个逻辑上的概念,类似于数据库中的表。它是对具有相似特征的文档的逻辑分组。索引提供了对文档的快速搜索、聚合和过滤的能力。 您可以将索引视为包含多个文档的容器。每个索引在 Elasticsearch 中具有唯一的名称,并且可以在集群中的多个节点上进行分片和复制,以实现高可用性和性能。
- 文档: 文档是 Elasticsearch 中的基本数据单元。它是以 JSON 格式表示的结构化数据对象。文档可以是任何类型的数据,例如产品信息、用户记录、日志条目等。 在一个索引中,每个文档都有一个唯一的 ID 来标识它。文档由一组字段组成,每个字段包含一个名称和相应的值。字段可以是各种类型,如字符串、数字、日期等。 文档存储在索引中,并且可以被搜索、检索和修改。通过索引和文档的结构化方式, Elasticsearch 能够高效地执行全文搜索和复杂的查询操作。
索引和文档之间的关系可以理解为索引是一个容器,而文档是容器中的数据。您可以在索引中创建、更新、删除文档,并使用索引进行数据的聚合、过滤和搜索操作。索引提供了组织和管理文档的能力,使您可以轻松地进行数据存储和检索。
父子文档是什么
父子文档是 Elasticsearch 中一种特殊的关系类型,用于表示文档之间的层次结构。在父子文档关系中,每个父文档可以有多个子文档,而子文档只能有一个父文档。
这种关系对于表示具有层级结构的数据非常有用,例如表示文章和评论之间的关系,或者表示产品和产品变体之间的关系。
以下是父子文档关系的一些重要概念和特点:
- 父文档和子文档: 父文档是拥有子文档的文档,而子文档是属于特定父文档的文档。子文档可以独立于其父文档存在,但它们与父文档之间建立了关联。
- 映射定义: 在创建索引时,您需要定义父子关系的映射定义。映射定义指定了父文档和子文档之间的关系及其字段。这包括声明字段类型、索引设置和关系定义等。
- 父子关系查询: 父子关系允许您在查询时以父文档或子文档为基础进行搜索。您可以执行针对特定父文档或子文档的查询,并根据关联关系来过滤结果。
- 父子关系的限制: 父子文档关系在设计上具有一些限制。例如,子文档和父文档必须位于同一个索引中,并且父子关系的字段必须具有相同的数据类型。此外,父文档和子文档之间的索引和删除操作需要进行同步,以保持数据的一致性。
尽管父子文档关系在某些情况下很有用,但在 Elasticsearch 7 及更高版本中已被弃用。相反,Elasticsearch 鼓励使用内嵌文档或嵌套对象来表示层次结构数据,以获得更好的性能和查询灵活性。因此,在使用最新版本的 Elasticsearch 时,应该避免使用父子文档关系,并考虑使用内嵌文档作为替代方案。