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

相关推荐
胚芽鞘6815 小时前
关于java项目中maven的理解
java·数据库·maven
岁忧6 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
CJi0NG6 小时前
【自用】JavaSE--算法、正则表达式、异常
java
Hellyc6 小时前
用户查询优惠券之缓存击穿
java·redis·缓存
今天又在摸鱼7 小时前
Maven
java·maven
老马啸西风7 小时前
maven 发布到中央仓库常用脚本-02
java·maven
代码的余温7 小时前
MyBatis集成Logback日志全攻略
java·tomcat·mybatis·logback
Edingbrugh.南空7 小时前
Flink自定义函数
大数据·flink
gaosushexiangji8 小时前
利用sCMOS科学相机测量激光散射强度
大数据·人工智能·数码相机·计算机视觉
前端_学习之路8 小时前
React--Fiber 架构
前端·react.js·架构