update docs

This commit is contained in:
2025-04-21 00:06:32 +08:00
parent dac6009eaa
commit 12d86316af

View File

@@ -82,26 +82,49 @@ Elasticsearch的文档是以JSON进行序列化并保存的每个JSON对象
每种类型的字段定义称为映射。 例如name 将映射为字符串,但 location 下的 geolocation 字段将映射为特殊的 geo_point 类型。 每种字段的处理方式都不同。 例如,你在名称字段中搜索单词,然后按位置搜索组以查找位于你居住地附近的组。
很多人认为 Elasticsearch 是 schema-less 的l大家都甚至认为 Elasticsearch 中的数据库是不需要 mapping 的。其实这是一个错误的概念Elasticsearch 实际上是有模式的其模式被称为“映射”Mapping
很多人认为 Elasticsearch 是 schema-less 的。大家都甚至认为 Elasticsearch 中的数据库是不需要 mapping 的。其实这是一个错误的概念。schema-less 在 Elasticsearch 中正确的理解是,我们不需要事先定义一个类型关系数据库中的 table 才使用数据库。在 Elasticsearch 中,我们可以不开始定义一个 mapping而直接写入到我们指定的 index 中。这个 index 的 mapping 是动态生成的 (当然我们也可以禁止这种行为)。其中的数据项的每一个数据类型是动态识别的。比如时间,字符串等,虽然有些的数据类型还是需要我们手动调整,比如 geo_point 等地理位置数据。另外,它还有一个含义,同一个 type我们在以后的数据输入中可能增加新的数据项从而生产新的 mapping。这个也是动态调整的。
Elasticsearch 具有 schema-less 的能力,这意味着无需显式指定如何处理文档中可能出现的每个不同字段即可对文档建立索引。 启用动态映射后Elasticsearch 自动检测并向索引添加新字段。 这种默认行为使索引和浏览数据变得容易-只需开始建立索引文档Elasticsearch 就会检测布尔值,浮点数和整数值,日期和字符串并将其映射到适当的 Elasticsearch 数据类型。
在 Elasticsearch 中正确的理解是,我们不需要事先定义一个类型关系数据库中的 table 才使用数据库。我们可以不开始定义一个 mapping而直接写入到我们指定的 index 中。
这个 index 的 mapping 是动态生成的 (当然我们也可以禁止这种行为)。其中的数据项的每一个数据类型是动态识别的。比如时间,字符串等,虽然有些的数据类型还是需要我们手动调整,比如 `geo_point` 等地理位置数据。
关于Type类型概念在6.x版本中一个索引(Index)可以拥有多个Type。在7.x版本(目前最新版本)一个索引只能拥有一个Type默认的type就是_doc在7.x版本中已经建议删除了。在未来的8.x版本会彻底删除。但是在7.x版本中一个文档还是必须归属于一个类型
另外,它还有一个含义,同一个 type我们在以后的数据输入中可能增加新的数据项从而生产新的 mapping。这个也是动态调整的
传统的RDBMS 在插入数据之前需要定义表结构各个字段的类型及长度等。当我们在ES中建立一个索引的第一个文档时如果你没有创建它的 schema那么 Elasticsearch 会根据所输入字段的数据进行猜测它的数据类型,比如上面的 user 被被认为是 text 类型,而 uid 将被猜测为整数类型。这种方式我们称之为 schema on write也即当我们写入第一个文档时Elasticsearch 会自动帮我们创建相应的 schema。在 Elasticsearch 的术语中mapping 被称作为 Elasticsearch 的数据 schema。一旦一个索引的某个字段的类型被确定下来之后那么后续导入的文档的这个字段的类型必须是和之前的是一致否则写入将导致错误。schema on write 可能在某些时候不是我们想要的,那么在这种情况下,我们可以事先创建一个索引的 schema。你将在后面的文章中看到。在最新的 Elasticsearch 设计中,也出现了一种叫做 schema on read 的设计。
Elasticsearch 具有 schema-less 的能力,这意味着无需显式指定如何处理文档中可能出现的每个不同字段即可对文档建立索引。启用**动态映射**后Elasticsearch 自动检测并向索引添加新字段。
这种默认行为使索引和浏览数据变得容易-只需开始建立索引文档Elasticsearch 就会检测布尔值,浮点数和整数值,日期和字符串并将其映射到适当的 Elasticsearch 数据类型。
关于Type类型概念在6.x版本中一个索引(Index)可以拥有多个Type。在7.x版本(目前最新版本)一个索引只能拥有一个Type默认的type就是_doc在7.x版本中已经建议删除了。
在未来的8.x版本会彻底删除但是在7.x版本中一个文档还是必须归属于一个类型。
传统的RDBMS 在插入数据之前需要定义表结构,各个字段的类型及长度等。
当我们在ES中建立一个索引的第一个文档时如果你没有创建它的 schema那么 Elasticsearch 会根据所输入字段的数据进行猜测它的数据类型,比如上面的 user 被被认为是 text 类型,而 uid 将被猜测为整数类型。
这种方式我们称之为 `schema on write`也即当我们写入第一个文档时Elasticsearch 会自动帮我们创建相应的 schema。
在 Elasticsearch 的术语中mapping 被称作为 Elasticsearch 的数据 schema。一旦一个索引的某个字段的类型被确定下来之后那么后续导入的文档的这个字段的类型必须是和之前的是一致否则写入将导致错误。
`schema on write` 可能在某些时候不是我们想要的,那么在这种情况下,我们可以事先创建一个索引的 schema。你将在后面的文章中看到。在最新的 Elasticsearch 设计中,也出现了一种叫做 `schema on read` 的设计。
# 索引
在ES中索引是ES组织文档的方式是拥有相结构文档的集合可以把ES的索引类比为关系型数据库的一张数据表。一个表可以存放多行数据。
在ES中索引是ES组织文档的方式它是一个逻辑概念,是拥有**相同 Schema结构/映射 Mapping**的集合可以把ES的索引类比为关系型数据库的一张数据表。一个表可以存放多行数据。
从物理存储角度看,一个 Elasticsearch 索引通常对应着**多个底层的 Lucene 索引**。
@@ -111,23 +134,36 @@ Elasticsearch 具有 schema-less 的能力,这意味着无需显式指定如
Elasticsearch 的节点的分类如下:
1. 主节点Master Node也叫作主节点主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch 中的主节点的工作量相对较轻。
用户的请求可以发往任何一个节点,并由该节点负责分发请求、收集结果等操作,而并不需要经过主节点转发
- 主节点的核心职责是维护整个集群的状态:
- 创建或删除索引
- 添加或移除节点。
- 发现新节点并分配其角色。
- 决定哪些分片(主分片和副本分片)应该位于哪些数据节点上(分片分配/再平衡)。
- 跟踪每个节点的状态,并计算集群的健康状态。
- 主节点特点:
- **不存储数据:** 最佳实践是让主节点eligible节点不承担数据存储和查询处理的负载以避免“脑裂”Split-Brain问题确保主节点能够快速、可靠地做出决策。
- **集群稳定性关键:** 主节点的稳定性和响应速度对整个集群至关重要。
- **奇数个推荐:** 为了保证主节点的选举能够成功通常需要超过半数的候选节点在线建议设置奇数个主节点eligible节点例如 3 个或 5 个)。
通过在配置文件中设置 node.master=true 来设置该节点成为候选主节点(但该节点不一定是主节点,主节点是集群在候选节点中选举出来的),在 Elasticsearch 集群中只有候选节点才有选举权和被选举权。其他节点是不参与选举工作的。
2. 数据节点Data Node数据节点负责数据的存储和相关具体操作比如索引数据的创建、修改、删除、搜索、聚合。
所以,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统 CPU、Memory 和 I/O 的性能消耗都很大。
所以,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统 CPU、Memory 和 I/O 的性能消耗都很大。
通常随着集群的扩大,需要增加更多的数据节点来提高可用性。通过在配置文件中设置 node.data=true 来设置该节点成为数据节点。
- **处理主要负载:** 这些节点承载着集群的计算和 I/O 负载。
3. 客户端节点Client Node就是既不做候选主节点也不做数据节点的节点只负责请求的分发、汇总等也就是下面要说到的协调节点的角色。
其实任何一个节点都可以完成这样的工作,单独增加这样的节点更多地是为了提高并发性。
```shell
node.master=falsenode.data=false
node.master=false
node.data=false
```
4. 协调节点Coordinating Node协调节点是一种角色而不是真实的 Elasticsearch 的节点,我们没有办法通过配置项来配置哪个节点为协调节点。集群中的任何节点都可以充当协调节点的角色。