共计 1941 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
在日常开发中,集成搜索功能是很多应用的必要需求。但开发者常常会遇到以下几个问题:

- 接口限流 :免费 API 往往有严格的调用频率限制,稍不注意就会触发限流
- 结果解析复杂 :返回的 JSON 数据结构嵌套深,提取关键信息需要大量代码
- 稳定性不足 :网络波动或服务端异常可能导致请求失败,缺乏健壮的重试机制
- 性能瓶颈 :频繁调用 API 导致响应时间变长,影响用户体验
技术选型
对比几种常见的搜索方案:
- 自建搜索引擎
- 优点:完全可控,定制性强
-
缺点:维护成本高,需要专业的搜索算法知识
-
Google Custom Search
- 优点:结果质量高
-
缺点:国内访问不稳定,配额有限
-
Baidu Search API
- 优点:国内访问速度快,文档齐全
- 缺点:免费版有调用次数限制
对于国内应用场景,Baidu Search API 在访问速度和易用性上具有明显优势。
核心实现
API 调用流程
- 注册百度开发者账号,创建应用获取 API Key
- 阅读接口文档,了解请求参数和返回结构
- 实现 HTTP 请求封装
- 处理返回结果
Python 示例代码
import requests
import json
class BaiduSearch:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "http://api.baidu.com/json/v1/search"
def search(self, query, page=1, size=10):
"""
执行搜索
:param query: 搜索关键词
:param page: 页码
:param size: 每页数量
:return: 解析后的结果列表
"""params = {"apiKey": self.api_key,"q": query,"pageNum": page,"pageSize": size}
try:
response = requests.get(self.base_url, params=params)
response.raise_for_status()
return self._parse_results(response.json())
except Exception as e:
print(f"搜索失败: {str(e)}")
return []
def _parse_results(self, raw_data):
"""解析返回的 JSON 数据"""
results = []
for item in raw_data.get("data", []):
results.append({"title": item.get("title", ""),"url": item.get("url",""),
"summary": item.get("summary", "")
})
return results
结果过滤技巧
- 按相关度排序:可以根据返回的 score 字段排序
- 去除广告结果:检查结果中是否包含推广标记
- 内容去重:对相似标题或 URL 的结果进行合并
性能优化
缓存策略
- 使用 Redis 缓存热门查询结果
- 设置合理的过期时间(如 5 分钟)
- 对查询参数生成 MD5 作为缓存 key
并发请求
from concurrent.futures import ThreadPoolExecutor
def batch_search(queries, max_workers=5):
"""并发执行多个搜索"""
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(baidu.search, q) for q in queries]
return [f.result() for f in futures]
错误重试
from retrying import retry
@retry(stop_max_attempt_number=3, wait_fixed=2000)
def search_with_retry(query):
return baidu.search(query)
避坑指南
- API 配额超限
-
解决方案:监控调用量,达到阈值时切换备用 Key
-
结果为空
-
检查:关键词是否包含特殊字符,尝试 URL 编码
-
响应慢
-
优化:减少返回字段,只请求必要数据
-
认证失败
- 检查:API Key 是否过期,IP 是否在白名单
安全考量
- API Key 保护
- 不要硬编码在代码中
-
使用环境变量或配置中心
-
频率控制
- 实现请求队列
-
添加适当的延迟
-
输入校验
- 过滤用户输入的搜索词
- 防止 SQL 注入等攻击
延伸思考
- 如何实现搜索结果的个性化排序(如根据用户历史行为调整权重)?
- 当搜索 API 不可用时,有哪些优雅降级的方案?
- 如何设计一个支持多搜索引擎切换的统一搜索接口?
通过本文介绍的方法,你应该能够快速构建一个稳定高效的搜索功能。实际开发中,还需要根据具体业务需求进行调整和优化。
正文完
发表至: 未分类
近三天内
