🧑 博主简介:CSDN博客专家 ,历代文学网 (PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索"历代文学 ")总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作 请加本人wx(注明来自csdn ):foreast_sea
【Elasticsearch】索引创建、修改、删除与查看
引言
在当今数据爆炸的时代,高效的数据存储和检索变得至关重要。Elasticsearch
作为一款强大的开源分布式搜索引擎,被广泛应用于各种场景,如日志分析 、全文搜索 、数据分析 等。而索引操作是Elasticsearch
中最基础也是最关键的部分,它直接影响着数据的存储和查询性能。
索引就像是图书馆中的目录,它帮助Elasticsearch
快速定位和检索数据。通过合理地创建索引,我们可以根据业务需求定义数据的结构和存储方式;查看索引信息能让我们了解索引的当前状态,以便及时发现问题并进行优化;修改索引设置则为我们提供了根据实际情况动态调整索引性能的能力;而删除索引则可以释放存储空间,保持系统的整洁和高效。
在本文中,我们将深入探讨Elasticsearch
的索引操作,包括创建索引 、查看索引信息 、修改索引设置 以及删除索引 。我们将详细介绍每个操作的原理、方法和注意事项,并结合实际案例进行演示,帮助读者全面掌握Elasticsearch
索引操作的技巧和方法,让你在数据处理的道路上更加得心应手。
1. Elasticsearch简介及相关Maven依赖
1.1 Elasticsearch简介
Elasticsearch
是一个基于Lucene
库的分布式、RESTful
风格的搜索和数据分析引擎。它具有高可扩展性 、高性能 、实时性等特点,能够快速地存储、检索和分析大量的数据。
Elasticsearch
采用了分布式架构,数据被分布存储在多个节点上,通过集群的方式实现数据的冗余和负载均衡。它支持多种数据类型,包括文本 、数字 、日期 等,并提供了丰富的查询语法和分析功能,如全文搜索 、模糊搜索 、聚合分析等。
1.2 相关Maven依赖
要在Java项目中使用Elasticsearch,我们需要添加相应的Maven依赖。以下是常用的依赖:
- Elasticsearch客户端依赖 :
elasticsearch-rest-high-level-client
:这是Elasticsearch官方提供的高级REST客户端,它提供了更方便、更高级的API来与Elasticsearch进行交互。通过这个客户端,我们可以使用Java代码来执行各种操作,如创建索引、插入数据、查询数据等。elasticsearch-rest-client
:这是Elasticsearch的低级REST客户端,它提供了更底层的API,允许我们直接发送HTTP请求到Elasticsearch集群。高级客户端实际上是基于低级客户端进行封装的,在一些特殊场景下,我们可能需要直接使用低级客户端来进行更灵活的操作。
以下是在Maven项目中添加Elasticsearch客户端依赖的示例:
xml
<dependencies>
<!-- Elasticsearch高级REST客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.0</version>
</dependency>
<!-- Elasticsearch低级REST客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.17.0</version>
</dependency>
</dependencies>
在上述示例中,我们添加了Elasticsearch高级REST客户端和低级REST客户端的依赖,并指定了版本号为7.17.0。你可以根据实际情况选择合适的版本。
添加了依赖后,我们就可以在Java代码中使用Elasticsearch客户端来进行索引操作了。接下来,我们将详细介绍各种索引操作的具体方法和示例。
2. 创建索引
2.1 创建索引的原理
在Elasticsearch中,索引是一种数据结构,它类似于数据库中的表,用于存储和组织数据。创建索引的过程实际上就是在Elasticsearch集群中创建一个新的索引结构,定义索引的名称、分片数量、副本数量以及映射等信息。
- 分片(Shard):分片是Elasticsearch中数据的基本存储单元。一个索引可以被分成多个分片,每个分片都是一个独立的Lucene索引,存储了部分数据。通过将数据分布在多个分片上,可以提高数据的存储和查询性能,实现水平扩展。例如,一个包含100万条数据的索引可以被分成5个分片,每个分片存储20万条数据,这样在查询时可以并行地在多个分片上进行搜索,提高查询效率。
- 副本(Replica):副本是分片的副本,用于提供数据的冗余和高可用性。每个分片可以有多个副本,副本和原始分片的数据是完全一致的。当原始分片出现故障时,副本可以自动接管工作,保证数据的可用性。例如,一个分片有2个副本,那么在集群中就会有3个相同的数据副本,即使其中一个出现问题,其他副本仍然可以正常提供服务。
- 映射(Mapping) :映射定义了索引中数据的结构和类型。它类似于数据库中的表结构,指定了每个字段的名称、类型、是否可搜索、是否可分析等信息。通过定义映射,我们可以告诉Elasticsearch如何处理和存储数据,以便更好地进行搜索和分析。例如,我们可以定义一个名为
user
的索引,其中包含name
(字符串类型)、age
(整数类型)和email
(字符串类型)等字段。
2.2 使用API创建索引
以下是使用Elasticsearch高级REST客户端创建索引的Java代码示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import java.io.IOException;
public class CreateIndexExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("my_index");
// 设置索引的分片和副本数量
request.settings(Settings.builder()
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 2));
// 定义索引的映射
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("properties")
.startObject("name")
.field("type", "text")
.endObject()
.startObject("age")
.field("type", "integer")
.endObject()
.endObject()
.endObject();
request.mapping(mappingBuilder);
// 发送创建索引请求
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
// 检查索引是否创建成功
boolean acknowledged = response.isAcknowledged();
if (acknowledged) {
System.out.println("索引创建成功!");
} else {
System.out.println("索引创建失败!");
}
// 关闭客户端
client.close();
}
}
在上述示例中,我们首先创建了一个RestHighLevelClient
对象,用于连接到Elasticsearch集群。然后,我们创建了一个CreateIndexRequest
对象,指定了索引的名称为my_index
。接着,我们使用settings
方法设置了索引的分片数量为3,副本数量为2。然后,我们使用XContentBuilder
构建了索引的映射,定义了name
字段为文本类型,age
字段为整数类型。最后,我们发送创建索引请求,并检查响应结果来判断索引是否创建成功。
2.3 使用配置文件创建索引
除了使用API创建索引外,我们还可以使用配置文件来创建索引。在Elasticsearch中,可以使用JSON格式的配置文件来定义索引的设置和映射。
以下是一个创建索引的配置文件示例(index_settings.json
):
json
{
"settings": {
"index.number_of_shards": 3,
"index.number_of_replicas": 2
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
要使用配置文件创建索引,可以使用以下命令:
bash
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d @index_settings.json
在上述命令中,我们使用curl
工具发送一个PUT请求到Elasticsearch集群,指定索引名称为my_index
,并将配置文件index_settings.json
的内容作为请求体发送。
3. 查看索引信息
3.1 查看索引信息的原理
查看索引信息是了解索引当前状态和结构的重要手段。通过查看索引信息,我们可以获取索引的设置、映射定义、状态信息等,以便及时发现问题并进行优化。
Elasticsearch提供了丰富的API来查询索引信息。当我们发送查询索引信息的请求时,Elasticsearch会从集群中获取相关的元数据信息,并将其返回给客户端。这些元数据信息包括索引的设置(如分片数量、副本数量、刷新间隔等)、映射定义(如字段的类型、属性等)以及状态信息(如索引的健康状态、分片的分配情况等)。
3.2 查询索引设置
以下是使用Elasticsearch高级REST客户端查询索引设置的Java代码示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings;
import java.io.IOException;
public class GetIndexSettingsExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建查询索引请求
GetIndexRequest request = new GetIndexRequest("my_index");
// 发送查询索引请求
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
// 获取索引的设置
IndexMetaData indexMetaData = response.getIndices().get(0);
Settings settings = indexMetaData.getSettings();
int numberOfShards = settings.getAsInt("index.number_of_shards", 1);
int numberOfReplicas = settings.getAsInt("index.number_of_replicas", 1);
System.out.println("索引名称:" + indexMetaData.getIndex().getName());
System.out.println("分片数量:" + numberOfShards);
System.out.println("副本数量:" + numberOfReplicas);
// 关闭客户端
client.close();
}
}
在上述示例中,我们首先创建了一个RestHighLevelClient
对象,用于连接到Elasticsearch集群。然后,我们创建了一个GetIndexRequest
对象,指定要查询的索引名称为my_index
。接着,我们发送查询索引请求,并从响应结果中获取索引的元数据信息。最后,我们从元数据信息中获取索引的设置,包括分片数量和副本数量,并将其打印输出。
3.3 查询索引映射定义
以下是使用Elasticsearch高级REST客户端查询索引映射定义的Java代码示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import java.io.IOException;
import java.util.Map;
public class GetIndexMappingExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建查询索引请求
GetIndexRequest request = new GetIndexRequest("my_index");
// 发送查询索引请求
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
// 获取索引的映射定义
MappingMetaData mappingMetaData = response.getMappings().get("my_index");
Map<String, Object> mapping = mappingMetaData.getSourceAsMap();
System.out.println("索引名称:" + mappingMetaData.getIndex());
System.out.println("映射定义:" + mapping);
// 关闭客户端
client.close();
}
}
在上述示例中,我们首先创建了一个RestHighLevelClient
对象,用于连接到Elasticsearch集群。然后,我们创建了一个GetIndexRequest
对象,指定要查询的索引名称为my_index
。接着,我们发送查询索引请求,并从响应结果中获取索引的映射元数据信息。最后,我们从映射元数据信息中获取索引的映射定义,并将其打印输出。
3.4 查询索引状态信息
以下是使用Elasticsearch高级REST客户端查询索引状态信息的Java代码示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.status.IndicesStatusRequest;
import org.elasticsearch.action.admin.indices.status.IndicesStatusResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.cluster.health.ClusterHealthStatus;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings;
import java.io.IOException;
public class GetIndexStatusExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建查询索引状态请求
IndicesStatusRequest request = new IndicesStatusRequest("my_index");
// 发送查询索引状态请求
IndicesStatusResponse response = client.indices().status(request, RequestOptions.DEFAULT);
// 获取索引的状态信息
ClusterHealthStatus status = response.getIndices().get(0).getStatus();
System.out.println("索引状态:" + status);
// 关闭客户端
client.close();
}
}
在上述示例中,我们首先创建了一个RestHighLevelClient
对象,用于连接到Elasticsearch集群。然后,我们创建了一个IndicesStatusRequest
对象,指定要查询的索引名称为my_index
。接着,我们发送查询索引状态请求,并从响应结果中获取索引的状态信息。最后,我们将索引的状态信息打印输出。
4. 修改索引设置
4.1 修改索引设置的原理
在Elasticsearch中,有些索引设置是可以在索引创建后动态修改的,如调整分片数、副本数、索引的刷新间隔等参数。修改索引设置的原理是通过向Elasticsearch集群发送更新索引设置的请求,Elasticsearch会根据请求中的设置信息来更新索引的元数据。
需要注意的是,并不是所有的索引设置都可以动态修改。例如,索引的分片数量在创建索引后是不能修改的,因为分片数量的改变涉及到数据的重新分配和索引的重建,这是一个非常耗时且复杂的操作。而副本数量、刷新间隔等设置则可以动态修改,以适应不同的业务需求。
4.2 调整副本数
以下是使用Elasticsearch高级REST客户端调整索引副本数的Java代码示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import java.io.IOException;
public class UpdateIndexReplicasExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建更新索引设置请求
UpdateSettingsRequest request = new UpdateSettingsRequest("my_index");
// 设置新的副本数量
Settings settings = Settings.builder()
.put("index.number_of_replicas", 3)
.build();
request.settings(settings);
// 发送更新索引设置请求
UpdateSettingsResponse response = client.indices().putSettings(request, RequestOptions.DEFAULT);
// 检查设置是否更新成功
boolean acknowledged = response.isAcknowledged();
if (acknowledged) {
System.out.println("副本数量更新成功!");
} else {
System.out.println("副本数量更新失败!");
}
// 关闭客户端
client.close();
}
}
在上述示例中,我们首先创建了一个RestHighLevelClient
对象,用于连接到Elasticsearch集群。然后,我们创建了一个UpdateSettingsRequest
对象,指定要更新设置的索引名称为my_index
。接着,我们使用Settings.builder
构建了新的设置信息,将副本数量设置为3。最后,我们发送更新索引设置请求,并检查响应结果来判断成功与否。
4.3 调整索引的刷新间隔
原理 :
索引的刷新间隔决定了数据从内存缓冲区写入磁盘索引的频率。较小的刷新间隔可以使数据更快地被搜索到,提高查询的实时性,但也会增加磁盘I/O的负担,影响索引的写入性能;较大的刷新间隔可以提高索引的写入性能,但会导致查询结果的实时性降低。因此,需要根据实际的业务需求在实时性和写入性能之间进行权衡。
以下是使用Java代码修改索引刷新间隔的示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.settings.put.UpdateSettingsRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import java.io.IOException;
public class RefreshIntervalAdjustmentExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 修改索引的刷新间隔
UpdateSettingsRequest updateSettingsRequest = new UpdateSettingsRequest("my_index");
Settings settings = Settings.builder()
.put("index.refresh_interval", "30s")
.build();
updateSettingsRequest.settings(settings);
client.indices().putSettings(updateSettingsRequest, RequestOptions.DEFAULT);
// 关闭客户端
client.close();
}
}
在上述代码中,通过创建UpdateSettingsRequest
对象,并设置要修改的索引名称和新的刷新间隔,然后调用indices().putSettings()
方法来更新索引的设置。这里将刷新间隔设置为30秒。
5. 删除索引
5.1 删除索引的原理
在Elasticsearch中,删除索引是一个相对简单但需要谨慎操作的过程。当删除一个索引时,Elasticsearch会首先标记该索引为删除状态,然后在后台逐步清理与该索引相关的所有数据和元数据,包括索引的分片、副本以及相关的索引配置信息等。这个过程是不可逆的,一旦索引被删除,其中的数据将无法恢复,因此在执行删除操作之前,一定要确保该索引不再需要,并且已经备份了重要的数据。
5.2 使用Java代码删除索引
以下是使用Java代码删除索引的示例:
java
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import java.io.IOException;
public class DeleteIndexExample {
public static void main(String[] args) throws IOException {
// 创建Elasticsearch客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 删除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("my_index");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
// 关闭客户端
client.close();
}
}
在上述代码中,通过创建DeleteIndexRequest
对象,并设置要删除的索引名称,然后调用indices().delete()
方法来删除索引。
5.3 使用REST API删除索引
除了使用Java代码,还可以使用Elasticsearch提供的REST API来删除索引。以下是使用curl
命令删除索引的示例:
bash
curl -X DELETE "localhost:9200/my_index"
在上述命令中,通过发送DELETE
请求到Elasticsearch的REST API端点,指定要删除的索引名称my_index
,即可删除该索引。
6. 总结
本文详细介绍了Elasticsearch中索引操作的两个重要方面:修改索引设置和删除索引。在修改索引设置方面,我们讨论了调整分片数、副本数和刷新间隔等操作的原理和方法,并通过实际案例展示了如何在Java代码中实现这些操作。在删除索引方面,我们介绍了删除索引的原理以及使用Java代码和REST API删除索引的方法。
在实际应用中,合理地修改索引设置和及时删除不再需要的索引对于提高Elasticsearch的性能和管理数据资源至关重要。通过灵活运用这些操作,我们可以根据业务需求优化索引的配置,提高系统的性能和可靠性,同时节省存储空间和资源。
7. 参考资料文献
- Elasticsearch官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
- 《Elasticsearch实战》书籍。