#!/bin/bash # # 从远程 ES 的 search_products_tenant_170 同步 10000 条到本机 search_products_tenant_0。 # 请求发往本机 ES,由本机去拉远程数据;需在本机 elasticsearch.yml 配置 reindex.remote.whitelist。 # # 用法: # ./scripts/reindex_from_remote_tenant_170_to_0.sh # # 环境变量(可选): # LOCAL_ES_HOST 本机 ES 地址,用于创建索引和发送 _reindex(默认从 .env 的 ES_HOST 读取,应为本机) # REMOTE_ES_HOST 远程 ES 地址(默认 http://120.76.41.98:9200) # REMOTE_ES_USER 远程 ES 用户名(默认 essa) # REMOTE_ES_PASS 远程 ES 密码(默认 4hOaLaf41y2VuI8y) # MAX_DOCS 同步条数(默认 10000) # set -e cd "$(dirname "$0")/.." PROJECT_ROOT="$(pwd)" # 加载 .env # shellcheck source=scripts/lib/load_env.sh source "${PROJECT_ROOT}/scripts/lib/load_env.sh" load_env_file "${PROJECT_ROOT}/.env" # 本机 ES(发 _reindex 请求的目标) LOCAL_ES_HOST="${LOCAL_ES_HOST:-${ES_HOST:-http://localhost:9200}}" ES_USERNAME="${ES_USERNAME:-}" ES_PASSWORD="${ES_PASSWORD:-}" ES_INDEX_NAMESPACE="${ES_INDEX_NAMESPACE:-}" # 远程 ES(数据源) REMOTE_ES_HOST="${REMOTE_ES_HOST:-http://120.76.41.98:9200}" REMOTE_ES_USER="${REMOTE_ES_USER:-essa}" REMOTE_ES_PASS="${REMOTE_ES_PASS:-4hOaLaf41y2VuI8y}" MAX_DOCS="${MAX_DOCS:-10000}" SOURCE_INDEX="search_products_tenant_170" DEST_INDEX="${ES_INDEX_NAMESPACE}search_products_tenant_0" MAPPING_FILE="${PROJECT_ROOT}/mappings/search_products.json" # 本机 curl 认证 AUTH_PARAM="" if [ -n "$ES_USERNAME" ] && [ -n "$ES_PASSWORD" ]; then AUTH_PARAM="-u ${ES_USERNAME}:${ES_PASSWORD}" fi echo "本机 ES: $LOCAL_ES_HOST" echo "远程 ES: $REMOTE_ES_HOST" echo "源索引: $SOURCE_INDEX" echo "目标索引: $DEST_INDEX" echo "同步条数: $MAX_DOCS" echo "" # 1. 若目标索引不存在,则创建 if ! curl -s $AUTH_PARAM "${LOCAL_ES_HOST}/${DEST_INDEX}" -o /dev/null -w "%{http_code}" | grep -q 200; then echo "创建目标索引: $DEST_INDEX" if [ ! -f "$MAPPING_FILE" ]; then echo "错误: mapping 文件不存在: $MAPPING_FILE" exit 1 fi curl -X PUT "${LOCAL_ES_HOST}/${DEST_INDEX}" \ -H "Content-Type: application/json" \ $AUTH_PARAM \ -d @"${MAPPING_FILE}" \ -w "\nHTTP: %{http_code}\n" -s | tail -1 echo "" else echo "目标索引已存在: $DEST_INDEX,将写入数据(可能覆盖同 id 文档)" fi # 2. Reindex from remote(JSON 中的密码用 env 传入,避免 shell 转义) echo "执行 Reindex from remote(最多 $MAX_DOCS 条)..." export REMOTE_ES_HOST REMOTE_ES_USER REMOTE_ES_PASS SOURCE_INDEX DEST_INDEX MAX_DOCS # ES 9.x 将 wait_for_completion 放在 query 参数,不在 body curl -X POST "${LOCAL_ES_HOST}/_reindex?wait_for_completion=true&pretty" \ -H "Content-Type: application/json" \ $AUTH_PARAM \ -d @- <