user_guide.md
8.45 KB
使用指南
本文档提供完整的使用指南,包括环境准备、数据导入、服务启动、测试等。
目录
环境准备
系统要求
- 操作系统: 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: 本地安装
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数据,用于测试:
- Tenant ID = 1: 生成的Mock数据(100个SPU)
- 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:6003 或 http://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,后续再生成
下一步
- 查看API文档: 参考
API_INTEGRATION_GUIDE.md了解完整的API接口 - 查看字段说明: 参考
INDEX_FIELDS_DOCUMENTATION.md了解索引字段 - 查看设计文档: 参考
设计文档.md了解系统架构 - 自定义配置: 编辑
config/config.yaml调整搜索配置
相关文档
- API接口文档:
API_INTEGRATION_GUIDE.md- 完整的API对接指南 - 字段说明文档:
INDEX_FIELDS_DOCUMENTATION.md- 索引字段详细说明 - 设计文档:
设计文档.md- 系统架构和设计说明 - README:
README.md- 项目概述和快速开始
文档版本: v1.0
最后更新: 2024-12