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. 重要索引启用快照备份

相关推荐
小锋java12349 分钟前
Maven 4 要来了:15 年后,Java 构建工具迎来"彻底重构"
java·maven
卓怡学长24 分钟前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea
小帽子_12324 分钟前
大型储能液冷温控系统原理:散热架构、流道设计与温控精准控制逻辑
架构·系统架构
庄周de蝴蝶25 分钟前
两次考试,总算压线通过系统分析师
后端·架构
行业研究员38 分钟前
当数据生产者变成 Agent,数据库底座如何重构?
大数据·数据库·重构
孫治AllenSun43 分钟前
【MDC】使用 MDC 封装一个 LogMdcUtil 工具类
java·spring boot·后端
人工智能培训44 分钟前
破解数据发展瓶颈 激活数字经济新动能
大数据·数据库·人工智能·深度学习·神经网络·机器学习·生成对抗网络
济*沧*海1 小时前
BaseMapper的介绍
java·windows·tomcat
plainGeekDev1 小时前
依赖管理 → Version Catalog
android·java·kotlin
1234567890@world1 小时前
知识管理 | 数字化 | APQC
大数据·数据库·人工智能