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
相关推荐
wafrdggh7 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
大大大大晴天9 小时前
OLTP、OLAP、数据湖、数据集市、湖仓一体到底是什么关系?
大数据
正在走向自律12 小时前
AI Agent 落地这一年:从“能跑起来”到“敢放出去”
大数据·人工智能·ai agent·智能体·mcp·a2a
freejackman13 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
goujunwe14 小时前
GEO 内容的“可摘录性”打磨技巧:段落、表格、小标题怎么写,方便大模型提取独立答案块
大数据·人工智能
小田学Python14 小时前
DeepSeek Harness 完整上手指南:安装部署 + 必装插件 + 用一周就回不去的功能
大数据·大模型·agent·ai工具·deepseek
成都蜀味缘餐饮技术培训学校18 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
roman_日积跬步-终至千里18 小时前
AI 能让一个人成为团队吗?从数据中台到 OPC,重新理解软件工程能力
大数据·人工智能·软件工程
演艺大赏20 小时前
NiFi 数据流实战:FTP→HDFS 与 CSV→Parquet,附坏数据、漏文件与双写
大数据
数字新视界21 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统