Elasticsearch 是一个基于 Lucene 的搜索引擎,它提供了分布式、高可用、多租户的能力。Elasticsearch 的核心组件包括节点(Node)、集群(Cluster)、索引(Index)、分片(Shard)、副本(Replica)等。下面我将结合案例代码解释和说明这些核心组件。
节点(Node)
节点是 Elasticsearch 集群中的一个服务器,它负责存储数据和处理客户端请求。节点可以通过配置文件或启动参数设置角色,如主节点(Master)、数据节点(Data)、客户端节点(Client)等。
案例代码:
// 创建一个节点设置 Settings settings = Settings.builder() .put("node.name", "node-1") .put("cluster.name", "my-cluster") .put("path.data", "/path/to/data") .put("path.logs", "/path/to/logs") .build(); // 创建一个节点 Node node = new Node(settings);
集群(Cluster)
集群是由一个或多个节点组成的,它们共同协作提供数据的存储和搜索服务。集群通过集群名称来区分,确保不同集群之间不会发生数据共享。
案例代码:
// 创建一个集群客户端 TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300)) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300)); // 关闭客户端 client.close();
索引(Index)
索引是具有相似特征的文档集合。索引可以包含一个或多个类型(Type),每种类型都有自己的字段映射。在 Elasticsearch 7.x 版本中,一个索引只能包含一个类型。
案例代码:
// 创建一个索引 CreateIndexRequest request = new CreateIndexRequest("my-index"); client.admin().indices().create(request).actionGet();
分片(Shard)
分片是索引数据的子集,它可以将一个大的索引拆分成多个部分,分布在不同的节点上。分片可以是主分片(Primary Shard)或副本分片(Replica Shard)。
案例代码:
// 创建一个索引,设置分片数量和副本数量 request = new CreateIndexRequest("my-index") .settings(Settings.builder() .put("number_of_shards", 3) .put("number_of_replicas", 2)); client.admin().indices().create(request).actionGet();
副本(Replica)
副本是分片的复制,可以提高数据的可用性和搜索性能。副本可以分布在不同的节点上,当主分片发生故障时,副本可以升级为主分片。
案例代码:
// 更新索引副本数量 UpdateIndexRequest updateRequest = new UpdateIndexRequest("my-index") .settings(Settings.builder() .put("number_of_replicas", 1)); client.admin().indices().updateSettings(updateRequest).actionGet();
以上是 Elasticsearch 核心组件的简要介绍和案例代码解释。要深入了解这些组件的原理和实现,建议阅读 Elasticsearch 官方文档和源码。