user_guide.md 8.45 KB

使用指南

本文档提供完整的使用指南,包括环境准备、数据导入、服务启动、测试等。

目录

  1. 环境准备
  2. 数据准备
  3. 数据导入
  4. 服务启动
  5. 测试验证
  6. 常见问题

环境准备

系统要求

  • 操作系统: Linux (推荐 CentOS 7+ / Ubuntu 18.04+)
  • Python: 3.8+
  • 内存: 建议 8GB+
  • 磁盘: 10GB+ (包含模型文件)
  • Elasticsearch: 8.x (可通过Docker运行)

安装依赖

1. 安装Python依赖

cd /home/tw/SearchEngine
pip install -r requirements.txt

2. 启动Elasticsearch

方式1: 使用Docker(推荐)

docker run -d \
  --name elasticsearch \
  -p 9200:9200 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
  elasticsearch:8.11.0

方式2: 本地安装

参考 Elasticsearch官方文档

3. 配置环境变量(可选)

创建 .env 文件:

# MySQL配置
DB_HOST=120.79.247.228
DB_PORT=3316
DB_DATABASE=saas
DB_USERNAME=saas
DB_PASSWORD=your_password

# Elasticsearch配置
ES_HOST=http://localhost:9200

# DeepL翻译API(可选)
DEEPL_AUTH_KEY=your_deepl_api_key

数据准备

Mock数据说明

项目提供了两套写死的Mock数据,用于测试:

  1. Tenant ID = 1: 生成的Mock数据(100个SPU)
  2. Tenant ID = 2: 从CSV导入的真实数据

数据表结构

系统使用店匠标准表结构:

  • SPU表: shoplazza_product_spu - 商品SPU数据
  • SKU表: shoplazza_product_sku - 商品SKU数据

表结构详见 INDEX_FIELDS_DOCUMENTATION.md


数据导入

步骤1: 导入Mock数据到MySQL

方式1: 使用脚本(推荐)

# 导入tenant_id=1的Mock数据(默认100个SPU)
./scripts/mock_data.sh

# 指定tenant_id和SPU数量
./scripts/mock_data.sh 1 200

# 使用显式参数
./scripts/mock_data.sh --mode mock --tenant-id 1 --num-spus 200

方式2: 导入CSV数据(tenant_id=2)

# 导入customer1的CSV数据
./scripts/mock_data.sh --mode csv \
  --csv-file data/customer1/goods_with_pic.5years_congku.csv.shuf.1w \
  --tenant-id 2 \
  --start-spu-id 1

方式3: 手动导入SQL

# 导入tenant_id=1的测试数据
mysql -h 120.79.247.228 -P 3316 -u saas -p saas < test_data_tenant1.sql

# 导入tenant_id=2的CSV数据
mysql -h 120.79.247.228 -P 3316 -u saas -p saas < customer1_data.sql

步骤2: 从MySQL导入数据到Elasticsearch

使用脚本(推荐)

# 导入tenant_id=1的数据
./scripts/ingest.sh 1

# 重建索引并导入数据
./scripts/ingest.sh 1 true

# 导入tenant_id=2的数据
./scripts/ingest.sh 2

手动执行

python scripts/ingest_shoplazza.py \
    --db-host 120.79.247.228 \
    --db-port 3316 \
    --db-database saas \
    --db-username saas \
    --db-password your_password \
    --tenant-id 1 \
    --config base \
    --es-host http://localhost:9200 \
    --recreate \
    --batch-size 500

完整工作流程示例

# 1. 导入tenant_id=1的Mock数据(100个SPU)
./scripts/mock_data.sh 1 100

# 2. 导入tenant_id=2的CSV数据
./scripts/mock_data.sh --mode csv \
  --csv-file data/customer1/goods_with_pic.5years_congku.csv.shuf.1w \
  --tenant-id 2

# 3. 将两个租户的数据导入ES
./scripts/ingest.sh 1
./scripts/ingest.sh 2

# 4. 验证数据导入
curl http://localhost:9200/search_products/_count

服务启动

方式1: 使用启动脚本(推荐)

# 启动前端和后端服务
./run.sh

# 重启所有服务
./restart.sh

方式2: 手动启动

启动后端API服务

python -m api.app \
  --host 0.0.0.0 \
  --port 6002 \
  --es-host http://localhost:9200 \
  --reload

启动前端服务(可选)

# 使用Python简单HTTP服务器
cd frontend
python -m http.server 6003

服务端口

服务 端口 URL
Elasticsearch 9200 http://localhost:9200
Backend API 6002 http://localhost:6002
Frontend Web 6003 http://localhost:6003
API Docs 6002 http://localhost:6002/docs

测试验证

1. 健康检查

curl http://localhost:6002/admin/health

预期响应:

{
  "status": "healthy",
  "elasticsearch": "connected"
}

2. 索引统计

curl http://localhost:6002/admin/stats

3. 简单搜索测试

curl -X POST http://localhost:6002/search/ \
  -H "Content-Type: application/json" \
  -d '{
    "query": "玩具",
    "size": 10
  }'

4. 带过滤器的搜索

curl -X POST http://localhost:6002/search/ \
  -H "Content-Type: application/json" \
  -d '{
    "query": "玩具",
    "size": 10,
    "filters": {
      "category_keyword": "益智玩具"
    },
    "range_filters": {
      "min_price": {
        "gte": 50,
        "lte": 200
      }
    }
  }'

5. 分面搜索测试

curl -X POST http://localhost:6002/search/ \
  -H "Content-Type: application/json" \
  -d '{
    "query": "玩具",
    "size": 10,
    "facets": [
      "category_keyword",
      "vendor_keyword"
    ]
  }'

6. 布尔表达式搜索

curl -X POST http://localhost:6002/search/ \
  -H "Content-Type: application/json" \
  -d '{
    "query": "玩具 AND (乐高 OR 芭比)",
    "size": 10
  }'

7. 图片搜索测试

curl -X POST http://localhost:6002/search/image \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://example.com/image.jpg",
    "size": 10
  }'

8. 前端界面测试

访问 http://localhost:6003http://localhost:6002/ 进行可视化测试。


常见问题

Q1: MySQL连接失败

症状: Failed to connect to MySQL

解决方案:

# 检查MySQL服务状态
mysql -h 120.79.247.228 -P 3316 -u saas -p -e "SELECT 1"

# 检查配置
cat .env | grep DB_

Q2: Elasticsearch连接失败

症状: Failed to connect to Elasticsearch

解决方案:

# 检查ES服务状态
curl http://localhost:9200

# 检查ES版本
curl http://localhost:9200 | grep version

# 确认配置
cat .env | grep ES_

Q3: 数据导入失败

症状: Error during data ingestion

解决方案:

# 检查MySQL数据是否存在
mysql -h 120.79.247.228 -P 3316 -u saas -p saas -e "SELECT COUNT(*) FROM shoplazza_product_spu WHERE tenant_id=1"

# 检查ES索引是否存在
curl http://localhost:9200/search_products

# 查看详细错误日志
python scripts/ingest_shoplazza.py --tenant-id 1 --recreate

Q4: 服务启动失败

症状: Address already in use 或端口被占用

解决方案:

# 查看占用端口的进程
lsof -i :6002  # 后端
lsof -i :6003  # 前端
lsof -i :9200  # ES

# 杀掉进程
kill -9 <PID>

# 或修改端口配置

Q5: 模型下载慢或失败

症状: 首次运行时模型下载很慢或超时

解决方案:

# 跳过embedding快速测试
./scripts/ingest.sh 1 true

# 或手动下载模型到指定目录
# TEXT_MODEL_DIR=/data/tw/models/bge-m3
# IMAGE_MODEL_DIR=/data/tw/models/cn-clip

Q6: 搜索无结果

症状: 搜索返回空结果

解决方案:

# 检查ES中是否有数据
curl http://localhost:9200/search_products/_count

# 检查tenant_id过滤是否正确
curl -X POST http://localhost:6002/search/ \
  -H "Content-Type: application/json" \
  -d '{"query": "*", "size": 10, "debug": true}'

# 查看调试信息

Q7: 向量计算很慢

症状: 生成embedding很慢

解决方案:

  • 使用GPU加速(如果可用)
  • 减少批量大小
  • 启用向量缓存
  • 首次导入时跳过embedding,后续再生成

下一步

  1. 查看API文档: 参考 API_INTEGRATION_GUIDE.md 了解完整的API接口
  2. 查看字段说明: 参考 INDEX_FIELDS_DOCUMENTATION.md 了解索引字段
  3. 查看设计文档: 参考 设计文档.md 了解系统架构
  4. 自定义配置: 编辑 config/config.yaml 调整搜索配置

相关文档

  • API接口文档: API_INTEGRATION_GUIDE.md - 完整的API对接指南
  • 字段说明文档: INDEX_FIELDS_DOCUMENTATION.md - 索引字段详细说明
  • 设计文档: 设计文档.md - 系统架构和设计说明
  • README: README.md - 项目概述和快速开始

文档版本: v1.0
最后更新: 2024-12