ElasticSearch如何使用bulk load

创建索引my_index:

复制代码
curl -X PUT "http://localhost:9200/my_index" \
  -H "Content-Type: application/json" \
  -d'
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "refresh_interval": "30s"
  },
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "name": {
        "type": "text"
      }
    }
  }
}'

bulk.json中存储数据:

复制代码
{"index": {"_index": "my_index", "_id": "1"}}
{"name": "张三", "age": 25}
{"index": {"_index": "my_index", "_id": "2"}}
{"name": "李四", "age": 30}
{"index": {"_index": "my_index", "_id": "3"}}
{"name": "王五", "age": 35}

bulk load插入:

复制代码
curl -X POST "http://localhost:9200/_bulk" -H "Content-Type: application/json" --data-binary @bulk.json

查看行数:

复制代码
curl -X GET "http://localhost:9200/my_index/_count"

Shell脚本:

bash 复制代码
#!/bin/bash

# 配置参数
SOURCE_FILE="processed_output.json"  # 源JSON文件
TEMP_BULK_FILE="bulk.json"           # 临时批量文件
ES_URL="localhost:9200/_bulk"        # ES Bulk API地址
BATCH_LINES=2                        # 每次读取的行数

# 检查源文件是否存在
if [ ! -f "$SOURCE_FILE" ]; then
    echo "错误:源文件 $SOURCE_FILE 不存在!"
    exit 1
fi

# 检查curl是否安装
if ! command -v curl &> /dev/null; then
    echo "错误:curl未安装,请先安装curl!"
    exit 1
fi

# 初始化行计数器
line_count=0
# 清空临时文件
> "$TEMP_BULK_FILE"

# 逐行读取源文件
while IFS= read -r line; do
    # 跳过空行
    if [ -z "$line" ]; then
        continue
    fi

    # 将当前行写入临时文件
    echo "$line" >> "$TEMP_BULK_FILE"
    ((line_count++))

    # 当累计行数达到设定值时执行POST请求
    if [ $line_count -eq $BATCH_LINES ]; then
        echo "=== 发送批量数据(行数:$line_count)==="
        
        # 执行curl POST请求
        response=$(curl -s -X POST "$ES_URL" \
            -H "Content-Type: application/json" \
            --data-binary "@$TEMP_BULK_FILE" \
            -w "%{http_code}" -o "es_response.tmp")
        
        # 获取HTTP状态码(最后3位)
        http_code=${response: -3}
        # 获取响应内容
        response_content=$(cat "es_response.tmp")

        # 检查请求是否成功
        if [ "$http_code" = "200" ]; then
            echo "✅ 请求成功,HTTP状态码:$http_code"
            echo "响应内容:$response_content"
        else
            echo "❌ 请求失败,HTTP状态码:$http_code"
            echo "错误响应:$response_content"
            # 可选:失败时退出脚本
            # exit 1
        fi

        # 重置计数器和临时文件
        line_count=0
        > "$TEMP_BULK_FILE"
        
        # 可选:添加延迟,避免ES压力过大
        # sleep 0.5
    fi

done < "$SOURCE_FILE"

# 处理剩余不足批量行数的内容
if [ $line_count -gt 0 ]; then
    echo "=== 发送剩余数据(行数:$line_count)==="
    
    response=$(curl -s -X POST "$ES_URL" \
        -H "Content-Type: application/json" \
        --data-binary "@$TEMP_BULK_FILE" \
        -w "%{http_code}" -o "es_response.tmp")
    
    http_code=${response: -3}
    response_content=$(cat "es_response.tmp")

    if [ "$http_code" = "200" ]; then
        echo "✅ 剩余数据请求成功,HTTP状态码:$http_code"
        echo "响应内容:$response_content"
    else
        echo "❌ 剩余数据请求失败,HTTP状态码:$http_code"
        echo "错误响应:$response_content"
    fi
fi

# 清理临时文件
rm -f "es_response.tmp"
> "$TEMP_BULK_FILE"

echo "=== 所有数据处理完成 ==="
exit 0
相关推荐
Elasticsearch17 小时前
通用表达式语言 ( CEL ): CEL 输入如何改进 Elastic Agent 集成中的数据收集
elasticsearch
武子康19 小时前
大数据-236 离线数仓 - 会员指标验证、DataX 导出与广告业务 ODS/DWD/ADS 全流程
大数据·后端·apache hive
武子康2 天前
大数据-235 离线数仓 - 实战:Flume+HDFS+Hive 搭建 ODS/DWD/DWS/ADS 会员分析链路
大数据·后端·apache hive
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
够快云库2 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
AI周红伟2 天前
周红伟:智能体全栈构建实操:OpenClaw部署+Agent Skills+Seedance+RAG从入门到实战
大数据·人工智能·大模型·智能体
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
计算机程序猿学长2 天前
大数据毕业设计-基于django的音乐网站数据分析管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
大数据·django·课程设计
B站计算机毕业设计超人2 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城2 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark