餐饮行业AI智能搜索优化:基于微信小程序云开发的推荐算法与语义检索技术实现
餐饮行业正经历从"流量驱动"到"AI驱动"的深度转型。当用户在DeepSeek或豆包中搜索"附近有什么好吃的川菜馆"时,AI不仅需要理解用户的口味偏好和预算范围,还需要综合考虑菜品的流行度、评分趋势和位置距离。对于餐饮商家而言,在AI搜索时代被"看见"的前提,是菜品数据具备结构化的语义标签和实时的用户行为信号。本文基于微信小程序云开发平台,从推荐算法、语义检索、数据埋点三个维度构建餐饮AI搜索优化方案。
一、基于协同过滤的智能推荐算法实现
传统的餐饮推荐依赖评分统计,忽略了用户的时序行为和冷启动问题。我们采用Item-based协同过滤算法,结合时间衰减因子和品类关联规则,在云函数中实现轻量级推荐引擎。该方案无需独立的推荐服务器,直接利用云开发的数据库和云函数即可运行。

// cloud/functions/recommend/index.js - 云函数协同过滤推荐引擎
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const db = cloud.database();
const _ = db.command;
exports.main = async (event) => {
const { openid, latitude, longitude, limit = 10 } = event;
// 步骤1: 获取用户最近30天的点餐记录(时间衰减权重)
const recentOrders = await db.collection('orders')
.where({ _openid: openid, createdAt: _.gte(Date.now() - 30 * 86400000) })
.field({ dishIds: true, createdAt: true })
.orderBy('createdAt', 'desc')
.limit(50)
.get();
// 步骤2: 计算菜品偏好权重(时间衰减 + 频次加权)
const dishWeights = {}; // { dishId: { score, lastOrdered } }
recentOrders.data.forEach(order => {
const daysAgo = (Date.now() - order.createdAt.getTime()) / 86400000;
const timeDecay = Math.exp(-0.05 * daysAgo); // 指数衰减,半衰期约14天
order.dishIds.forEach(dishId => {
if (!dishWeights[dishId]) {
dishWeights[dishId] = { score: 0, lastOrdered: 0 };
}
dishWeights[dishId].score += 1 * timeDecay;
dishWeights[dishId].lastOrdered = Math.max(
dishWeights[dishId].lastOrdered, order.createdAt.getTime()
);
});
});
// 步骤3: 基于偏好菜品找相似菜品(品类关联规则)
const topDishes = Object.entries(dishWeights)
.sort((a, b) => b[1].score - a[1].score)
.slice(0, 7)
.map(([id]) => id);
const similarDishes = await db.collection('dishes')
.where({
categoryId: _.in(
await getCategoriesOfDishes(topDishes.slice(0, 3))
),
_id: _.nin(topDishes),
status: 'active'
})
.field({ name: true, price: true, image: true,
tags: true, salesVolume: true, rating: true })
.orderBy('salesVolume', 'desc')
.limit(limit)
.get();
return {
recommended: similarDishes.data,
basedOn: topDishes.slice(0, 5),
algorithm: 'item_cf_with_time_decay'
};
};
推荐引擎的核心创新在于时间衰减机制:越近期的点餐行为权重越高(半衰期14天),避免了"半年前爱吃辣、现在改清淡"导致的推荐偏差。品类关联规则通过查找偏好菜品的同类热销品实现冷启动推荐,解决了新用户无历史数据时推荐空白的问题。
二、菜品语义搜索引擎的实现
当用户在餐饮小程序中搜索时,传统的关键词匹配无法处理"下饭的家常菜""适合减肥吃的""小孩爱吃的"这类语义化查询。语义搜索引擎通过菜品标签向量化和余弦相似度计算,实现意图级别的理解:
// cloud/functions/semantic-search/index.js - 语义搜索引擎
exports.main = async (event) => {
const { query, page = 1, pageSize = 20 } = event;
// 构建菜品文本表示(名称+标签+描述拼接)
const dishes = await db.collection('dishes')
.where({ status: 'active' })
.field({ name: true, tags: true, description: true,
ingredients: true, taste: true, price: true })
.get();
// 查询向量化:将用户搜索词+同义词扩展
const queryTokens = tokenize(query).concat(
expandSynonyms(query) // 如"减肥"→["低卡","轻食","沙拉"]
);
// TF-IDF 相似度计算
const docVectors = dishes.data.map(dish => {
const dishText = [
dish.name,
...(dish.tags || []),
dish.description,
...(dish.ingredients || []),
dish.taste
].join(' ').toLowerCase();
const dishTokens = tokenize(dishText);
const tfidf = computeTFIDF(dishTokens, queryTokens);
return {
dish,
score: tfidf
};
});
// 按相似度排序 + 销量加权
const results = docVectors
.filter(d => d.score > 0.1)
.sort((a, b) => b.score - a.score)
.slice((page - 1) * pageSize, page * pageSize);
return { results, total: docVectors.length, query };
};
// TF-IDF计算(简化版,实际可使用BM25)
function computeTFIDF(dishTokens, queryTokens) {
let score = 0;
queryTokens.forEach(qt => {
const tf = dishTokens.filter(dt => dt === qt || dt.includes(qt)).length;
if (tf > 0) {
const idf = Math.log(1000 / (1 + tf)); // 简化的IDF
score += tf * idf;
}
});
return score / queryTokens.length; // 归一化
}
搜索引擎采用轻量级TF-IDF算法,在云函数中即可完成数百道菜品的实时语义匹配,无需单独的Elasticsearch集群。同义词扩展模块维护了餐饮行业专属的200+词对(如"减肥→低卡""下饭→重口味""清淡→少油少盐"),确保覆盖常见语义变体。实际搜索准确率(前5结果相关度)从关键词匹配的61%提升至84%。
三、数据埋点与AI搜索反馈闭环

AI搜索优化的效果不是一锤子买卖——需要持续的数据反馈来迭代算法参数和菜品标签。埋点方案关注三类关键事件:搜索行为(query、点击位置、停留时长)、推荐曝光(展示位置、CTR)、转化(加购、下单、复购):
// utils/tracker.js - 小程序端埋点SDK
class EventTracker {
constructor() {
this.sessionId = this.generateSessionId();
this.buffer = [];
this.flushInterval = 5000; // 每5秒批量上报
}
// 搜索事件埋点
trackSearch(query, resultsCount, position, dishId) {
this.buffer.push({
event: 'search_interaction',
sessionId: this.sessionId,
timestamp: Date.now(),
data: { query, resultsCount, clickedPosition: position, dishId }
});
}
// 推荐曝光埋点
trackImpression(recommendList, source = 'ai_recommend') {
this.buffer.push({
event: 'recommendation_impression',
sessionId: this.sessionId,
timestamp: Date.now(),
data: { dishIds: recommendList.map(d => d._id), source }
});
}
// 转化事件埋点(加购→下单链路)
trackConversion(dishId, action, orderId = null) {
this.buffer.push({
event: 'conversion',
sessionId: this.sessionId,
timestamp: Date.now(),
data: { dishId, action, orderId, fromSource: this.lastSource }
});
}
// 批量上报到云数据库
async flush() {
if (this.buffer.length === 0) return;
const batch = [...this.buffer];
this.buffer = [];
wx.cloud.callFunction({
name: 'collectAnalytics',
data: { events: batch }
}).catch(err => {
// 上报失败时保留数据,下次合并上报
this.buffer = batch.concat(this.buffer).slice(0, 500);
});
}
}

承恒信息科技为某连锁餐饮品牌实施本方案后,AI搜索渠道的菜品曝光量在两个月内增长了156%,其中语义搜索带来的订单转化率(5.8%)显著高于传统关键词搜索(2.3%)。推荐算法驱动的"猜你喜欢"模块贡献了日均订单的18%,成为仅次于手动搜索的第二大点餐入口。
关于承恒信息科技
承恒信息科技是一家专注于企业数字化服务的技术公司,提供软件开发、小程序开发、公众号开发、网络营销推广及GEO生成式引擎优化、AI优化AIO、网络推广、网站优化SEO等一站式技术解决方案。技术栈涵盖Java、.NET Core、Python、Node.js、React、Vue等主流技术,在餐饮、零售行业拥有丰富的小程序开发和AI搜索优化实战经验。