目 录CONTENT

文章目录

【入门篇】3. Elasticsearch不同版本API差异详解

冰点
2023-05-15 / 0 评论 / 0 点赞 / 25 阅读 / 50475 字

Elasticsearch 8.x 版本首个版本 Elasticsearch 8.0.0 发布于 2022 年 2 月 11 日4。

Elasticsearch 7.x 版本于 2019 年开始发布,首个版本 Elasticsearch 7.0.0 发布于 2019 年 4 月 10 日4。

主要版本概述

Elasticsearch的发展历程中,几个主要版本带来了重大变革。2010年发布的1.x版本奠定了分布式搜索的基础。2016年的5.x版本引入了多项性能优化和新特性。2017年的6.x版本进一步简化了索引管理,限制一个索引只能有一个映射类型。2018年发布的7.x版本开始弃用类型概念,并在集群管理、安全性等方面进行改进。2021年底发布的8.x版本则在安全性、新搜索API特性以及与机器学习的集成上有更多创新。

以下是Elasticsearch 6.x、7.x、8.x三个版本的核心差异对比表格,涵盖架构、功能、API、兼容性等关键维度

Elasticsearch 6.x、7.x、8.x 版本差异对比

功能领域

6.x(2017-2019)

7.x(2019-2022)

8.x(2022-至今)

核心架构

支持多类型索引(每个索引可包含多个Type),Zen集群协调层

移除多类型索引(单索引仅支持_doc类型),升级为Zen2集群协调层,提升稳定性

引入Elasticsearch Security内置安全模块(替代X-Pack基础安全),默认启用TLS和认证

索引与类型

每个索引可包含多个Type(如user、post),6.0后限制一个索引最多包含1个Type

彻底移除多类型,单索引仅支持_doc类型,_mapping/typeAPI弃用

延续单类型设计,无变化,但强化索引生命周期管理(ILM)自动化策略

API 变更

支持_search多类型查询,如/index/type1,type2/_search

弃用多类型相关API,查询必须指定_doc类型;弃用fielddata直接使用,推荐keyword子字段

移除7.x中弃用的API(如_mapping/type),新增向量搜索API(dense_vector字段类型)

查询语言

支持Query DSL,ES

QL处于实验阶段

ES

性能与存储

引入BKD树优化地理坐标查询,索引合并策略优化

引入search_after替代深度分页(from+size深度超过10000时推荐),减少内存开销

优化索引速度和查询性能,支持负载感知分片路由,提升高并发场景下的稳定性

安全与权限

基础安全需依赖X-Pack插件(付费),支持基本认证和TLS

X-Pack集成基础安全功能(如认证、授权、加密),但仍需手动配置

内置Security模块,默认启用TLS和认证,支持SAML单点登录和细粒度权限控制

新功能

引入机器学习(ML)基础模块(异常检测、预测),支持Rollup聚合

新增间隔查询(Intervals Queries)、Transforms数据转换功能,优化聚合性能

新增向量搜索(支持语义检索、相似性匹配)、数据流(Data Streams)管理时序数据

客户端兼容性

Java客户端为TransportClient( deprecated ),推荐RestHighLevelClient

TransportClient在7.15+正式弃用,强制使用RestHighLevelClient

推出新Java客户端Elasticsearch Java API Client(基于HTTP/2),官方推荐使用

升级兼容性

6.x可升级至7.x,但需处理类型和API弃用(如移除多类型)

7.x可升级至8.x,但需注意安全配置变更(如启用内置Security)和向量搜索相关适配

8.x升级至9.x需关注新API弃用(如行为分析模块),但8.x内部版本升级兼容性较高

生态集成

与Logstash、Kibana、Beats集成成熟,支持Spark和Hadoop连接器

强化与Elastic Cloud集成,优化Kibana可视化和仪表盘功能

深化AI集成(如与第三方LLM服务对接),支持向量数据库与检索场景结合

关键版本特性解析

1. 6.x → 7.x:架构与类型的重大变革

  • 多类型移除:6.x中多类型索引(如user和post共存于一个索引)在7.x被彻底废弃,强制单类型设计,避免数据结构混乱。

  • 客户端升级:TransportClient因Java兼容性问题被弃用,转向HTTP协议的RestHighLevelClient,提升跨语言兼容性。

2. 7.x → 8.x:安全与智能化升级

  • 安全内置化:8.x将7.x中X-Pack的基础安全功能(认证、加密)集成到核心模块,默认启用TLS和密码认证,降低安全配置门槛。

  • 向量搜索落地:新增dense_vector字段类型和向量搜索API,支持语义检索(如文档相似性匹配),适配AI检索场景(如推荐系统、问答系统)。

3. 版本选择建议

  • 6.x:仅适用于无法升级的遗留系统(如老日志集群),但需注意官方已停止维护,存在安全风险。

  • 7.x:适合需要稳定性和兼容性的场景(如日志分析、传统搜索),但需手动配置安全模块。

  • 8.x:推荐用于需要向量搜索、自动化运维(ILM)和高安全性的现代应用(如智能检索、时序数据监控)。

升级注意事项

  • 6.x → 7.x:

    • 提前迁移多类型索引至单类型,使用reindexAPI重构数据结构。

    • 替换TransportClient为RestHighLevelClient,调整客户端代码。

  • 7.x → 8.x:

    • 配置内置Security模块,生成证书并启用认证(如设置Kibana访问密码)。

    • 若使用向量检索场景,需提前测试dense_vector字段和相关API兼容性。

更多细节可参考官方版本说明:

API差异详细分析

索引与文档操作

在早期版本(1.x - 6.x)中,索引可以包含多个映射类型,这使得在同一个索引中存储不同结构的文档成为可能。例如,在一个名为company的索引中,可以有employee和department两种类型的文档。创建索引和文档的API调用方式如下:

// 创建索引并定义类型映射(6.x版本示例)
PUT /company
{
    "mappings": {
        "employee": {
            "properties": {
                "name": { "type": "text" },
                "age": { "type": "integer" }
            }
        },
        "department": {
            "properties": {
                "name": { "type": "text" },
                "size": { "type": "integer" }
            }
        }
    }
}

// 索引一个员工文档(6.x版本示例)
PUT /company/employee/1
{
    "name": "John Doe",
    "age": 30
}

从7.0版本开始,映射类型被逐步弃用,走向无类型(typeless)的设计。到8.x版本完全移除类型概念。在无类型API中,创建索引和索引文档的方式简化为:

// 创建索引(7.x及以上版本示例)
PUT /company
{
    "mappings": {
        "properties": {
            "name": { "type": "text" },
            "age": { "type": "integer" }
        }
    }
}

// 索引一个文档(7.x及以上版本示例)
PUT /company/_doc/1
{
    "name": "John Doe",
    "age": 30
}

这种变化简化了索引结构,避免了不同类型间字段映射冲突的问题,同时也优化了索引性能和存储效率。

搜索API变化

语法简化

早期版本的搜索API语法相对复杂,例如在多条件查询时,需要使用较为繁琐的布尔查询结构。以查询年龄大于30且名字包含“John”的员工为例,在6.x版本中:

GET /company/employee/_search
{
    "query": {
        "bool": {
            "must": [
                { "match": { "name": "John" } },
                { "range": { "age": { "gt": 30 } } }
            ]
        }
    }
}

在7.x及以上版本中,语法得到了一定简化,虽然布尔查询结构依然是核心,但整体更加简洁直观:

GET /company/_search
{
    "query": {
        "bool": {
            "must": [
                { "match": { "name": "John" } },
                { "range": { "age": { "gt": 30 } } }
            ]
        }
    }
}

新特性引入

8.x版本引入了一些新的搜索API特性,如支持自然语言处理(NLP)的查询。通过新的query_string语法,可以直接使用自然语言进行搜索:

GET /company/_search
{
    "query": {
        "query_string": {
            "query": "employees older than 30 named John",
            "default_field": "name"
        }
    }
}

这种新特性使得非技术用户也能方便地进行复杂搜索,极大地拓展了Elasticsearch在智能搜索场景中的应用。

集群管理API

节点管理

在早期版本中,添加或删除节点的操作相对复杂,需要手动修改配置文件并重启相关服务。例如在1.x版本中,要添加一个节点,需要在新节点的配置文件中正确配置集群名称、节点名称以及与其他节点的通信地址等信息,然后启动节点。而在7.x及以上版本中,通过API可以更方便地管理节点。例如,使用_cluster/settings API可以动态修改集群的一些设置,包括添加或删除节点的相关配置:

// 动态更新集群设置以添加新节点(示例配置,实际需根据环境调整)
PUT /_cluster/settings
{
    "persistent": {
        "cluster": {
            "nodes": {
                "new_node": {
                    "host": "new_node_ip",
                    "port": 9300
                }
            }
        }
    }
}

集群状态监控

随着版本演进,集群状态监控API也变得更加丰富和易用。在早期版本中,获取集群状态信息相对有限。而在8.x版本中,_cluster/health API返回的信息更加详细,不仅可以查看集群的健康状态(绿色、黄色、红色),还能获取更多关于分片分配、节点状态等信息:

GET /_cluster/health?pretty=true

通过上述API调用,可以得到类似如下详细的集群健康信息:

{
    "cluster_name": "my_cluster",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 3,
    "number_of_data_nodes": 3,
    "active_primary_shards": 10,
    "active_shards": 20,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 100.0
}

这些信息对于及时发现集群中的潜在问题,如节点故障、分片分配不均等,提供了有力支持。

安全相关API

早期版本(如1.x - 5.x)中,Elasticsearch的安全性相对较弱,缺乏完善的认证、授权和加密机制。从6.x版本开始,逐渐加强安全特性,到7.x和8.x版本,安全相关API得到了极大丰富。 在7.x版本中,引入了基于角色的访问控制(RBAC),可以通过API创建角色、用户,并分配权限。例如,创建一个具有只读权限的角色和用户:

// 创建只读角色
PUT /_security/role/read_only_role
{
    "cluster": ["monitor"],
    "indices": [
        {
            "names": ["*"],
            "privileges": ["read"]
        }
    ]
}

// 创建用户并关联角色
PUT /_security/user/read_only_user
{
    "password": "password",
    "roles": ["read_only_role"]
}

在8.x版本中,安全功能进一步增强,默认开启了更多安全特性,如TLS加密等。同时,安全配置和管理的API也更加完善,例如可以通过API方便地管理SSL证书:

// 上传SSL证书(示例,实际操作可能因环境复杂)
PUT /_ssl/certificates/my_cert
{
    "certificate": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
    "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
}

这些安全相关API的改进,使得Elasticsearch在企业级应用中能够更好地满足数据安全和合规性要求。

版本升级建议

从低版本升级到7.x

如果从1.x - 6.x版本升级到7.x版本,首先需要关注类型弃用的问题。在升级前,应检查代码中所有与类型相关的API调用,将其修改为无类型的调用方式。例如,将索引文档的API从/index/type/id改为/index/_doc/id。同时,由于7.x版本在集群管理、搜索API等方面有优化,建议对相关代码进行全面审查和测试,确保在新环境下功能正常。对于安全方面,要利用新的RBAC机制重新规划和配置用户权限。

从7.x升级到8.x

从7.x升级到8.x时,新的搜索API特性(如NLP支持)为优化搜索功能提供了机会,可以评估是否将其集成到现有应用中。在安全方面,8.x版本默认开启更多安全特性,需要确保相关配置正确,如SSL证书的配置等。此外,集群管理API在8.x版本可能有一些小的调整,要注意检查与集群监控、节点管理相关的代码是否需要更新。

0

评论区