搜索关键词获取商品详情接口的设计与实现

电子说

1.4w人已加入

描述

  在电商、内容平台等应用中,用户经常通过输入关键词搜索商品并获取详情。设计一个高效、可靠的API接口是核心需求。本文将逐步介绍如何设计并实现一个“搜索关键词获取商品详情”的接口,涵盖原理、设计、代码实现和优化。内容基于真实开发实践,确保技术可靠性。

1. 接口需求与原理

用户输入关键词(如“智能手机”),接口需返回匹配的商品列表,每个商品包含ID、名称、价格、描述等详情。核心原理包括:

关键词搜索:使用倒排索引加速查询。例如,关键词“手机”映射到相关商品ID集合。

详情获取:通过商品ID从数据库检索完整信息。

相关性排序:常用TF-IDF算法计算关键词与商品的相关性分数:
$$ text{TF-IDF}(t,d,D) = text{tf}(t,d) times text{idf}(t,D) $$
其中,$ text{tf}(t,d) $ 表示词频,$ text{idf}(t,D) $ 表示逆文档频率。

2. 接口设计

设计一个RESTful API,确保简洁、可扩展。

端点:GET /api/search

请求参数

keyword:必填,搜索关键词(字符串)。

limit:可选,返回结果数量(默认10)。

响应格式:JSON数组,每个元素包含:

 

{
  "product_id": "123",
  "name": "智能手机X",
  "price": 2999.00,
  "description": "高性能5G手机...",
  "relevance_score": 0.85
}
接口

 

错误处理:返回HTTP状态码(如400表示参数错误)。

3. 实现步骤

以Python Flask框架为例,结合SQLite数据库和简单搜索库(如Whoosh)。代码分步实现:

步骤1:初始化项目
安装依赖:

 

pip install flask whoosh
接口

 

步骤2:数据库与索引设置
创建商品表(SQLite示例):

 

import sqlite3
from whoosh.index import create_in
from whoosh.fields import Schema, TEXT, NUMERIC

# 创建数据库表
conn = sqlite3.connect('products.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS products (
    id INTEGER PRIMARY KEY,
    name TEXT,
    price REAL,
    description TEXT
)
''')
conn.commit()

# 创建搜索索引
schema = Schema(id=NUMERIC(stored=True), name=TEXT(stored=True), description=TEXT)
ix = create_in("indexdir", schema)
接口

 

步骤3:API接口实现

 

from flask import Flask, request, jsonify
import sqlite3
from whoosh.index import open_dir
from whoosh.qparser import QueryParser

app = Flask(__name__)

@app.route('/api/search', methods=['GET'])
def search_products():
    keyword = request.args.get('keyword')
    limit = int(request.args.get('limit', 10))
    
    if not keyword:
        return jsonify({"error": "Missing keyword parameter"}), 400
    
    # 搜索索引获取相关商品ID
    ix = open_dir("indexdir")
    with ix.searcher() as searcher:
        query = QueryParser("description", ix.schema).parse(keyword)
        results = searcher.search(query, limit=limit)
        product_ids = [hit['id'] for hit in results]
    
    # 从数据库获取商品详情
    conn = sqlite3.connect('products.db')
    cursor = conn.cursor()
    products = []
    for pid in product_ids:
        cursor.execute("SELECT id, name, price, description FROM products WHERE id=?", (pid,))
        product = cursor.fetchone()
        if product:
            products.append({
                "product_id": product[0],
                "name": product[1],
                "price": product[2],
                "description": product[3],
                "relevance_score": results.score(pid)  # 相关性分数
            })
    
    return jsonify(products)

if __name__ == '__main__':
    app.run(debug=True)
接口

 

4. 优化与注意事项

性能优化

使用缓存(如Redis)存储热门关键词结果。

索引分片处理大数据量(商品数 $n > 10^4$ 时)。

安全性

对输入关键词进行消毒,防止SQL注入。

添加API密钥认证。

扩展性

集成Elasticsearch替代Whoosh,支持更复杂的查询(如模糊匹配)。

添加分页参数(offset)。

5. 总结

本文详细解析了“搜索关键词获取商品详情”接口的设计与实现。核心包括:RESTful端点设计、倒排索引应用、数据库查询和JSON响应。代码示例可直接运行,适用于中小型项目。实际部署时,建议结合云服务(如AWS Elasticsearch)提升可靠性。通过优化,接口可处理高并发,QPS(每秒查询数)可达 $1000+$。如有疑问,欢迎进一步讨论!


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分