Elasticsearch RESTful API入门:索引的增删改查完全指南

Elasticsearch RESTful API入门:索引的增删改查完全指南

本文专为Java开发初学者设计,将手把手教你掌握Elasticsearch索引的核心操作

一、环境准备与基本概念

1.1 安装Elasticsearch(Windows版)

1.访问官网下载ZIP包

2.解压后进入bin目录,双击elasticsearch.bat启动

3.验证安装:浏览器访问http://localhost:9200,看到JSON响应即成功

1.2 核心概念

索引(Index): 相当于关系型数据库中的"数据库"

类型(Type): 7.x后已弃用,现默认为_doc

文档(Document): 索引中的基本单位,JSON格式

分片(Shard): 索引的分区,用于水平扩展

副本(Replica): 分片的备份,提高可用性

二、索引操作实战

2.1 创建索引

bash 复制代码
PUT /products
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "name": {"type": "text"},
      "price": {"type": "double"},
      "description": {"type": "text"},
      "category": {"type": "keyword"},
      "stock": {"type": "integer"},
      "created_at": {"type": "date"}
    }
  }
}

2.2 查看索引信息

bash 复制代码
GET /products

// 响应示例
{
  "products": {
    "aliases": {},
    "mappings": {
      "properties": {
        "category": {"type": "keyword"},
        "created_at": {"type": "date"},
        "description": {"type": "text"},
        "name": {"type": "text"},
        "price": {"type": "double"},
        "stock": {"type": "integer"}
      }
    },
    "settings": {
      "index": {
        "creation_date": "1689987632211",
        "number_of_shards": "1",
        "number_of_replicas": "1",
        // ...其他设置
      }
    }
  }
}

2.3 删除索引

bash 复制代码
DELETE /products

// 成功响应
{
  "acknowledged": true
}

2.4 修改索引设置

bash 复制代码
PUT /products/_settings
{
  "index": {
    "number_of_replicas": 2
  }
}

2.5 索引状态管理

bash 复制代码
// 关闭索引
POST /products/_close

// 打开索引
POST /products/_open

// 清除缓存
POST /products/_cache/clear

三、索引操作可视化界面

https://example.com/es-index-management.png

实际界面示例 - 显示索引状态、分片分布和统计信息

四、Java客户端操作示例

java 复制代码
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;

public class IndexOperations {

    private final RestHighLevelClient client;

    public IndexOperations(RestHighLevelClient client) {
        this.client = client;
    }

    // 创建索引
    public boolean createProductIndex() throws Exception {
        CreateIndexRequest request = new CreateIndexRequest("products");
        
        // 索引设置
        request.settings(Settings.builder()
                .put("index.number_of_shards", 1)
                .put("index.number_of_replicas", 1)
        );
        
        // 映射定义
        String mapping = "{\"properties\":{\"name\":{\"type\":\"text\"},\"price\":{\"type\":\"double\"}," +
                         "\"description\":{\"type\":\"text\"},\"category\":{\"type\":\"keyword\"}," +
                         "\"stock\":{\"type\":\"integer\"},\"created_at\":{\"type\":\"date\"}}}";
        
        request.mapping(mapping, XContentType.JSON);
        
        CreateIndexResponse response = client.indices()
                .create(request, RequestOptions.DEFAULT);
        
        return response.isAcknowledged();
    }

    // 检查索引是否存在
    public boolean indexExists(String indexName) throws Exception {
        GetIndexRequest request = new GetIndexRequest(indexName);
        return client.indices().exists(request, RequestOptions.DEFAULT);
    }

    // 获取索引信息
    public GetIndexResponse getIndexInfo(String indexName) throws Exception {
        GetIndexRequest request = new GetIndexRequest(indexName);
        return client.indices().get(request, RequestOptions.DEFAULT);
    }

    // 删除索引
    public boolean deleteIndex(String indexName) throws Exception {
        DeleteIndexRequest request = new DeleteIndexRequest(indexName);
        AcknowledgedResponse response = client.indices()
                .delete(request, RequestOptions.DEFAULT);
        return response.isAcknowledged();
    }
}

五、最佳实践与常见问题

5.1 索引命名规范

1. 仅小写字母

2. 不能包含:, /, *, ?, ", <, >, |, (空格), , #

3. 避免使用-和_开头

4. 长度限制255字符

5.2 常见错误处理

java 复制代码
// 索引已存在
{
  "error": {
    "root_cause": [
      {"type": "resource_already_exists_exception", "reason": "index [products] already exists"}
    ],
    "status": 400
  }
}

// 解决方案:先删除或使用不同名称
DELETE /products

5.3 索引设计建议

1. 根据数据量预估合理分片数(每个分片20-50GB)

2. 冷热数据分离:使用ILM(Index Lifecycle Management)

3. 定期监控索引健康状态

4. 重要索引启用快照备份

相关推荐
诸葛务农几秒前
类脑智能技术与系统:类脑大模型架构(上)
人工智能·深度学习·神经网络·架构
天远Date Lab13 分钟前
构建金融级信贷审批系统:Java Spring Boot 集成天远借贷行为验证 API 全指南
java·大数据·spring boot·金融
-拟墨画扇-13 分钟前
Git | 文件修改操作
大数据·git·gitee·github·gitcode
Wang's Blog13 分钟前
RabbitMQ: 集群监控与高可用架构深度解析之状态检测、问题诊断
架构·rabbitmq
-拟墨画扇-15 分钟前
Git | 版本控制操作
大数据·git·gitee·github
虾说羊16 分钟前
transferManager为什么在工作中禁止使用 (怎么进行优化 怎么避免多线程的堵塞)
java·服务器·数据库
码农水水16 分钟前
宇树科技Java面试被问:Atomic原子类的实现原理(CAS机制)
java·开发语言
liuc031720 分钟前
JAVA调用deepSeek demo
java·开发语言
LJ979511127 分钟前
智能连接:Infoseek如何重新定义媒体发布效率
大数据·人工智能
爱吃山竹的大肚肚27 分钟前
Spring Boot 与 Apache POI 实现复杂嵌套结构 Excel 导出
java·spring boot·后端·spring·spring cloud·excel