一、接口设计原理
-
架构设计:
-
采用RESTful API风格
-
基于Elasticsearch 8.x构建搜索核心
-
使用Nginx作为API网关
-
查询响应时间控制在200ms以内
-

点击获取key和secret
-
技术栈:
bash# 核心依赖 Python 3.9+ Django REST Framework elasticsearch-py jieba分词库
二、核心代码实现
python
# views.py
from rest_framework.response import Response
from elasticsearch import Elasticsearch
from django.conf import settings
class ProductSearchAPI(APIView):
def get(self, request):
es = Elasticsearch(settings.ES_HOSTS)
# 获取查询参数
keyword = request.GET.get('q', '')
page = int(request.GET.get('page', 1))
page_size = 20
# 构建DSL查询
body = {
"query": {
"multi_match": {
"query": keyword,
"fields": ["name^3", "description^2", "tags"],
"type": "best_fields"
}
},
"from": (page-1)*page_size,
"size": page_size,
"highlight": {
"fields": {
"name": {},
"description": {}
}
}
}
# 执行搜索
result = es.search(
index="yiwugo_products",
body=body
)
return Response(self.format_results(result))
def format_results(self, raw_data):
# 结果格式化处理...
三、关键优化策略
-
分词优化:
- 自定义义乌小商品行业词典
- 中英文混合分词处理
- 同义词扩展搜索
-
缓存机制:
ini# 使用Redis缓存热门查询 cache_key = f"search:{keyword}:{page}" cached = redis_client.get(cache_key) if cached: return Response(json.loads(cached))
-
性能监控:
- 使用Prometheus采集QPS指标
- 慢查询日志记录
- 自动扩容机制
四、接口测试示例
bash
# 请求示例
GET /api/search?q=圣诞礼品&page=2 HTTP/1.1
# 响应示例
{
"total": 1250,
"results": [
{
"id": "P10086",
"name": "圣诞<em>礼品</em>套装",
"price": 9.9,
"highlight": "...包含多种圣诞<em>礼品</em>..."
}
]
}