create_tenant_index.sh 1.99 KB
#!/bin/bash

# 为租户创建 ES 索引
# 用法: ./scripts/create_tenant_index.sh <tenant_id>

# 切换到项目根目录
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_HOST="${ES_HOST:-http://localhost:9200}"
ES_USERNAME="${ES_USERNAME:-}"
ES_PASSWORD="${ES_PASSWORD:-}"
ES_INDEX_NAMESPACE="${ES_INDEX_NAMESPACE:-}"

# 检查命令行参数
if [ $# -eq 0 ]; then
    echo "用法: $0 <tenant_id>"
    echo "示例: $0 170"
    exit 1
fi

TENANT_ID="$1"
BASE_INDEX_NAME="search_products_tenant_${TENANT_ID}"
ES_INDEX="${ES_INDEX_NAMESPACE}${BASE_INDEX_NAME}"
MAPPING_FILE="mappings/search_products.json"

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

# 手动确认
echo "创建索引前,将删除已有的同名索引。"
echo "索引名称: $ES_INDEX"
echo "(注意:包含环境前缀 ES_INDEX_NAMESPACE='${ES_INDEX_NAMESPACE}')"
echo "请输入索引名称 '$ES_INDEX' 来确认:"
read -r user_input

if [ "$user_input" != "$ES_INDEX" ]; then
    echo "确认失败,索引名称不匹配。退出操作。"
    exit 1
fi

echo "确认成功,继续创建索引..."

# 构建 curl 认证参数
AUTH_PARAM=""
if [ -n "$ES_USERNAME" ] && [ -n "$ES_PASSWORD" ]; then
    AUTH_PARAM="-u ${ES_USERNAME}:${ES_PASSWORD}"
fi

# 删除已存在的索引(如果存在)
echo
echo "删除索引: $ES_INDEX"
echo
curl -X DELETE "${ES_HOST}/${ES_INDEX}" $AUTH_PARAM -s -o /dev/null -w "HTTP状态码: %{http_code}\n"


echo
echo "创建索引: $ES_INDEX"
echo

# 创建索引(使用 mapping 文件)
curl -X PUT "${ES_HOST}/${ES_INDEX}" \
    -H "Content-Type: application/json" \
    $AUTH_PARAM \
    -d @"${MAPPING_FILE}" \
    -w "\nHTTP状态码: %{http_code}\n"

echo
echo "完成!"
echo "提示: 请调用 /indexer/reindex 接口导入数据"