reindex_from_remote_tenant_170_to_0.sh 3.29 KB
#!/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 @- <<EOF
{
  "max_docs": ${MAX_DOCS},
  "source": {
    "remote": {
      "host": "${REMOTE_ES_HOST}",
      "username": "${REMOTE_ES_USER}",
      "password": "${REMOTE_ES_PASS}"
    },
    "index": "${SOURCE_INDEX}",
    "size": 500
  },
  "dest": {
    "index": "${DEST_INDEX}"
  }
}
EOF

echo ""
echo "完成。校验条数: curl $AUTH_PARAM '${LOCAL_ES_HOST}/${DEST_INDEX}/_count?pretty' -H 'Content-Type: application/json' -d '{\"query\":{\"match_all\":{}}}'"