19 KiB
Session: 2026-06-25 17:00:23 GMT+8
- Session Key: agent:main:feishu:direct:ou_e63ce6b760ad39382852472f28fbe2a2
- Session ID: 65bf7bd1-fb56-419f-b300-cee2cfe6cb01
- Source: feishu
Conversation Summary
assistant: 我再看看每张表里的一些样例数据,方便你理解字段的实际内容: assistant: 好了,以下是两张埋点表的完整数据结构:
📊 埋点数据结构
线上 PostgreSQL vala_bi 库中有两张埋点表:
1. growth_activity_behavior(增长活动行为埋点)
数据量: 38,063 条
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 自增主键 |
| es_id | varchar(255) | ES 原始 ID(唯一) |
| account_id | int | 账号 ID(=0 为匿名) |
| account_name | varchar(255) | 账号名 |
| activity | text | 活动标识(目前有 900、26100 两种) |
| behavior | varchar(255) | 行为类型 |
| sub_behavior | varchar(255) | 子行为类型 |
| source | varchar(255) | 来源入口 |
| info | text | 扩展 JSON(如 {"h5_url_parameter":"zz"}) |
| user_id | int | 设备/会话级 ID |
| user_name | varchar(255) | 用户名 |
| created_at | timestamp | 事件时间 |
behavior 枚举:
- H5 购买流程(sub: H5 页面曝光时 / 商品切换点击 / 支付成功 / 立即购买按钮点击)
- 落地页曝光、落地页主按钮点击
- 获取验证码点击、获取验证码结果
- 手机号弹窗关闭点击、挽留弹窗按钮点击
source 枚举: homebuttom、course、seasonList、seasonNav、AD、空
索引: created_at、user_id、es_id (唯一)
2. user_behavior_buried_points(端内学习行为埋点)
数据量: 65,549 条
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int | 自增主键 |
| burying_point_id | int | 埋点 ID(目前有 1000、1100) |
| burying_point_name | varchar(255) | 埋点名称 |
| burying_point_sub_id | int | 子埋点 ID(1~5) |
| burying_point_sub_name | varchar(255) | 子埋点名称 |
| account_id | int | 账号 ID |
| account_name | varchar(255) | 账号名 |
| character_id | int | 角色 ID |
| character_name | varchar(255) | 角色名 |
| active_time | int | 事件时间戳(秒) |
| version_id | varchar(255) | 客户端版本 |
| step_duration | int | 步骤耗时(秒) |
| finish_status | varchar(255) | 完成状态 |
| season_package_id | int | 季度包 ID |
| season_package_name | varchar(255) | 季度包名 |
| unit_id | int | 单元 ID |
| unit_name | varchar(255) | 单元名 |
| lesson_id | int | 课时 ID |
| lesson_name | varchar(255) | 课时名 |
| component_id | int | 组件 ID |
| component_name | varchar(255) | 组件名 |
| c_type | varchar(255) | 组件类型(如 core_listening_drag) |
| c_id | varchar(255) | 组件实例 ID |
| learning_module_id | int | 学习模块 ID |
| learning_module_name | varchar(255) | 学习模块名 |
| learning_point_id | int | 知识点 ID |
| learning_point_name | varchar(255) | 知识点名 |
| card_id | int | 卡片 ID |
| card_name | varchar(255) | 卡片名 |
| data_version | varchar(255) | 数据版本 |
| ex2 | text | 扩展字段 2 |
| ex3 | text | 扩展字段 3 |
| es_id | varchar(255) | ES 原始 ID |
索引: account_id、character_id、active_time、burying_point_id
总结:
growth_activity_behavior→ 偏增长侧(H5购买漏斗、落地页、验证码等转化行为)user_behavior_buried_points→ 偏端内学习侧(课程组件级的学习交互行为,粒度到 card 级别)
需要我进一步分析某张表的具体数据分布或字段含义吗? user: [message_id: om_x100b6cfaf809bce0b12c638b6dd832a] 李承龙: 我想看看es库里面的数据结构 assistant: 业务索引不少,我来看看主要的几个索引的字段结构: assistant: 再看看其他几个业务索引的结构: assistant: 好了,全部查完了。以下是 Online ES 库的完整数据结构梳理:
📊 Online ES 数据结构总览
线上 ES 共有 18 个业务索引(排除系统索引),按功能模块分类如下:
一、用户行为埋点类
| 索引 | 数据量 | 说明 |
|---|---|---|
user_behavior_buried_points |
3741万 (11.6GB) | 端内学习行为埋点(组件级) |
growth_activity_behavior |
4.4万 (14MB) | 增长活动行为(H5购买漏斗/落地页) |
user-audio |
496万 (2.7GB) | 用户音频交互记录 |
word_sentence_learn_data |
439 (381KB) | 单词/句子学习数据 |
二、LLM/AI 服务日志类
| 索引 | 数据量 | 说明 |
|---|---|---|
llm_api_stat |
601万 (1GB) | LLM API 调用统计(token用量/耗时) |
llm_roleplayagent_round_log |
160万 (6.4GB) | 角色扮演对话日志(每轮对话详情) |
llm_pron_eval |
215万 (1.8GB) | 发音评测日志 |
llm_asr_log |
290万 (1.9GB) | 语音识别(ASR)日志 |
llm_realtime_asr_log |
125万 (586MB) | 实时流式ASR日志 |
llm_tts_log |
284万 (1.7GB) | 文本转语音(TTS)日志 |
llm_image_speaking |
62万 (419MB) | 看图说话交互日志 |
llm_ai_tools_log |
31万 (279MB) | AI 工具调用日志(翻译/图片处理/检测等) |
llm_api_error_based_correction |
6.7万 (42MB) | 纠错API日志 |
llm_api_writing |
9418 (6.4MB) | 写作API日志 |
llm_core_speaking_monologue |
590 (940KB) | 独白口语练习日志 |
llm_scene_chat_log |
55 (360KB) | 场景对话日志 |
llm_instruction_control_log |
3298 (21MB) | 指令控制日志 |
三、其他
| 索引 | 数据量 | 说明 |
|---|---|---|
echo_trace-write |
3321 (6.7MB) | 小葵(销售bot)会话轨迹日志 |
vala-user-chat-log |
1547 (4.2MB) | 用户聊天对话日志 |
llm_api_knowledge_card_transition |
23 (78KB) | 知识卡片转换日志 |
llm_audio_denoise |
0 | 音频降噪(空) |
pronunciation_eval_logs |
4 (62KB) | 旧版发音评测日志(已废弃) |
四、核心索引字段详解
1. user_behavior_buried_points(3741万条,最大业务索引)
accountId(long) - 账号ID
characterId(long) - 角色ID
buryingPointId(long) - 埋点ID
buryingPointSubId(long)- 子埋点ID
activeTime(long) - 事件时间戳
stepDuration(long) - 步骤耗时
cType(text) - 组件类型
cId(text) - 组件实例ID
componentId(long) - 组件ID
lessonId(long) - 课时ID
unitId(long) - 单元ID
seasonPackageId(long) - 季度包ID
learningModuleId(long) - 学习模块ID
learningPointId(long) - 知识点ID
cardId(long) - 卡片ID
courseLevel(keyword) - 课程等级
finishStatus(text) - 完成状态
action(keyword) - 动作
button(keyword) - 按钮
location(keyword) - 位置
dataVersion(keyword) - 数据版本
num1/num2/num3(double)- 数值扩展
ex2~ex6(keyword) - 字符扩展
versionId(text) - 客户端版本
2. llm_roleplayagent_round_log(160万条,AI对话核心)
user_id(keyword) - 用户ID
session_id(keyword) - 会话ID
config_id(keyword) - 配置ID
npc_id(keyword) - NPC ID
current_round(long) - 当前轮数
round(long) - 总轮数
user_input(keyword) - 用户输入
user_text(keyword) - 用户原文
npc_message(keyword) - NPC回复
npc_translation(keyword) - NPC翻译
hint_msg(keyword) - 提示信息
feedback(keyword) - 语法反馈
grammar_rating(long) - 语法评分
score(long) - 总分
score_ratio(float) - 得分率
task_completed(bool) - 任务完成
final_completed(bool) - 最终完成
llm_model(keyword) - 使用模型
execution_time_ms(float) - 执行耗时
timestamp(long) - 时间戳
subtask_status(nested) - 子任务完成状态
round_eval_dict(nested)- 每轮评分详情
3. llm_api_stat(601万条,API统计)
api_source(keyword) - API来源
service_name(keyword) - 服务名称
input_tokens(long) - 输入token数
output_tokens(long) - 输出token数
time_s(float) - 耗时(秒)
write_time_int(long) - 写入时间戳
write_time_str(keyword)- 写入时间串
4. echo_trace-write(小葵会话轨迹)
contact_id(keyword) - 联系人ID
bot_wxid(keyword) - Bot微信ID
session_id(keyword) - 会话ID
skill(keyword) - 当前技能
stage(keyword) - 当前阶段
step(keyword) - 当前步骤
data.event(keyword) - 事件类型
data.current_stage - 当前阶段
data.current_vars - 当前变量(手机号/绑定状态/账号信息等)
data.replies(keyword) - 回复内容
timestamp(date) - 时间
需要我进一步查看某个具体索引的样例数据,或者按特定维度做分析吗?
user: [message_id: om_x100b6cfa8ddf34a8b34f7f9a184e54a]
李承龙: 索引user_behavior_buried_points的字段都有哪些
assistant: user_behavior_buried_points 索引的完整字段列表如下:
| 字段名 | 类型 | 可检索 | 说明 |
|---|---|---|---|
accountId |
long | ✅ | 账号ID |
accountName |
text | ❌ (index:false) | 账号名称 |
action |
keyword | ✅ | 动作类型 |
activeTime |
long | ✅ | 事件时间戳(秒级) |
buryingPointId |
long | ✅ | 埋点ID |
buryingPointName |
text | ❌ (index:false) | 埋点名称 |
buryingPointSubId |
long | ✅ | 子埋点ID |
buryingPointSubName |
text | ❌ (index:false) | 子埋点名称 |
button |
keyword | ✅ | 按钮标识 |
cId |
text (standard) | ✅ | 组件实例ID |
cType |
text (standard) | ✅ | 组件类型(如 core_listening_drag) |
cardId |
long | ✅ | 卡片ID |
cardName |
text (standard) | ✅ | 卡片名称 |
characterId |
long | ✅ | 角色ID |
characterName |
text | ❌ (index:false) | 角色名称 |
componentId |
long | ✅ | 组件ID |
componentName |
text (standard) | ✅ | 组件名称 |
courseLevel |
keyword | ✅ | 课程等级(如 L1、L2) |
dataVersion |
keyword | ✅ | 数据版本 |
ex2 |
keyword | ✅ | 扩展字段2 |
ex3 |
keyword | ✅ | 扩展字段3 |
ex4 |
keyword | ✅ | 扩展字段4 |
ex5 |
keyword | ✅ | 扩展字段5 |
ex6 |
keyword | ✅ | 扩展字段6 |
finishStatus |
text | ✅ | 完成状态 |
learningModuleId |
long | ✅ | 学习模块ID |
learningModuleName |
text (standard) | ✅ | 学习模块名称 |
learningPointId |
long | ✅ | 知识点ID |
learningPointName |
text (standard) | ✅ | 知识点名称 |
lessonId |
long | ✅ | 课时ID |
lessonName |
text (standard) | ✅ | 课时名称 |
location |
keyword | ✅ | 位置标识 |
num1 |
double | ✅ | 数值扩展1 |
num2 |
double | ✅ | 数值扩展2 |
num3 |
double | ✅ | 数值扩展3 |
seasonPackageId |
long | ✅ | 季度包ID |
seasonPackageName |
text (standard) | ✅ | 季度包名称 |
stepDuration |
long | ✅ | 步骤耗时(秒) |
unitId |
long | ✅ | 单元ID |
unitName |
text (standard) | ✅ | 单元名称 |
versionId |
text | ✅ | 客户端版本号 |
总计 38 个字段,其中:
- 可精确检索(keyword/long/double):25 个
- 全文检索(text+standard):9 个
- 不可检索(index:false):4 个(accountName、buryingPointName、buryingPointSubName、characterName)
数据量 3741万条,占用 11.6GB。
user: [message_id: om_x100b6cfa8859f8e8b16f7789094ee17]
李承龙: buryingPointName和buryingPointSubName都有哪些
assistant: 由于 buryingPointName 和 buryingPointSubName 字段是 index: false(不可检索/聚合),我需要通过查文档来获取它们的实际值:
assistant: 整理完毕,以下是完整的 buryingPointName 和 buryingPointSubName 枚举:
buryingPointId → buryingPointName 对照表
| buryingPointId | buryingPointName | 数据量 |
|---|---|---|
| 100 | 登录创角流程 | 87万 |
| 101 | (空) | 1.9万 |
| 102 | (空) | 6.3万 |
| 103 | (空) | 40万 |
| 200 | 新手引导流程 | 2.2万 |
| 300 | 关卡内操作 | 450万 |
| 400 | 组件内操作 | 2651万 |
| 500 | 主框架操作 | 130万 |
| 600 | 收集页操作 | 12万 |
| 700 | 知识模块操作 | 6.2万 |
| 800 | 交易相关流程 | 2.2万 |
| 900 | (空) | 64 |
| 1000 | (空) | 5万 |
| 1100 | (空) | 1.6万 |
| 1200 | (空) | 276万 |
| 1300 | (空) | 69万 |
buryingPointSubId → buryingPointSubName 对照表
100 - 登录创角流程
| subId | subName |
|---|---|
| 15 | 点击启动时 |
| 16 | 点击切换账号时 |
| 17 | 点击选择角色时 |
| 19 | 点击出发时 |
| 21 | 选择性别男 |
| 22 | 选择性别女 |
| 23 | 点击随机按钮时 |
| 24 | 点击键入名字框体时 |
| 25 | 点击选择生日框体时 |
| 26 | 点击下一步时 |
| 27 | 点击上一步时 |
| 28~72 | (空,后期新增的未命名子埋点) |
200 - 新手引导流程
| subId | subName |
|---|---|
| 1 | 点击无人机附近地面时 |
| 2 | 点击触发无人机气泡时 |
| 3 | 点击正确选项时 |
| 4 | 点击错误选项时 |
| 5 | 点击轻点后说话按钮时 |
| 6 | 点击发送按钮时 |
| 8 | 点击小喇叭播放语音时 |
| 9 | 点击重试一次按钮时 |
| 10 | 点击解锁手环时 |
300 - 关卡内操作
| subId | subName |
|---|---|
| 1 | 点击气泡触发组件时 |
| 2 | TimeAction触发组件时 |
| 3 | 点击打开任务板 |
| 4 | 点击关闭任务板 |
| 5 | 点击任务板开始自动寻路时 |
| 6 | 自动寻路触发组件时 |
| 9 | 打开Brainy界面时 |
| 10 | 打开备忘录时 |
| 12 | 点击知识模块时 |
| 13 | 点击知识点时 |
| 14 | 点击下一个问题时 |
| 15 | 点击关闭界面时 |
| 16 | 点击完成时 |
| 17 | 点击开始知识回顾时 |
400 - 组件内操作(最大,2651万条)
| subId | subName |
|---|---|
| 1 | 组件通过时 |
| 2 | 组件失败(结果为Fail)时 |
| 3 | 组件结果为Pass时 |
| 4 | 组件结果为Good时 |
| 5 | 组件结果为Excellent时 |
| 6 | 点击离开时 |
| 8 | 点击下一句时 |
| 9 | 点击播放音频时 |
| 10 | 点击展开释义时 |
| 11 | 点击选项时 |
| 12 | 点击下一句时 |
| 13 | 点击播放音频时 |
| 14 | 点击展开释义时 |
| 15 | 点击查看文本时 |
| 19 | 点击选项时 |
| 20 | 点击提示按钮时 |
| 35 | 点击选项时 |
| 36 | 点击继续时 |
| 37 | 点击收起时 |
| 38 | 点击展开时 |
| 39 | 点击翻译时 |
| 40 | 点击要翻译的句子时 |
| 41 | 点击退出翻译时 |
| 42 | 点击小喇叭时 |
| 43 | 点击开始任务时 |
| 44 | 点击麦克风按钮时 |
| 45 | 点击发送时 |
| 46 | 点击取消发送时 |
| 47 | 点击小喇叭时 |
| 50 | 打开Brainy时 |
| 51 | 关闭Brainy时 |
| 52 | 点击Brainy小喇叭时 |
| 53~158 | (空,后期新增) |
500 - 主框架操作
| subId | subName |
|---|---|
| 1 | 点击关卡卡片时 |
| 2 | 点击开始关卡时 |
| 3 | 点击继续关卡时 |
| 4 | 点击查看结算记录列表时 |
| 5 | 点击重新开始时 |
| 6 | 点击继续时 |
| 7 | 点击关闭「是否继续」的二次弹窗时 |
| 8 | 点击下发导航条切换故事时 |
| 9 | 点击下方Story按钮时 |
| 10 | 点击下方Collection按钮时 |
| 11 | 点击学习中心按钮时 |
| 12 | 点击学习模块按钮时 |
| 13 | 点击能力训练按钮时 |
| 14 | 点击单元挑战按钮时 |
| 15 | 点击进入角色信息页面按钮时 |
600 - 收集页操作
| subId | subName |
|---|---|
| 1 | 点击引导高亮的卡牌时 |
| 2 | 点击立刻升级时 |
| 3 | 点击卡牌详情时 |
| 4 | 点击关闭卡牌详情时 |
| 5 | 点击立刻升级时 |
| 6 | 点击购买高光时刻二次确认弹窗确认时 |
| 7 | 点击购买高光时刻二次确认弹窗返回时 |
| 8 | 点击加号时 |
| 9 | 点击减号时 |
| 10 | 点击加号时 |
| 11 | 点击再想想时 |
| 12 | 点击兑换时 |
700 - 知识模块操作
| subId | subName |
|---|---|
| 1 | 点击知识模块页签时 |
| 2 | 点击能力训练页签时 |
| 3 | 点击知识模块卡片时 |
| 5 | 点击知识点时 |
| 15 | 练习中点击选项时 |
| 16 | 练习中点击选好了时 |
| 17 | 练习中点击小喇叭时 |
| 18 | 练习结束点击离开按钮时 |
| 19 | 点击进入挑战按钮时 |
| 20 | 点击离开挑战按钮时 |
| 21 | 离开挑战二次确认点击放弃时 |
| 22 | 离开挑战二次确认点击继续时 |
| 23 | 重新进入挑战点击继续时 |
| 24 | 重新进入挑战点击重新开始时 |
| 25 | 点击选项时 |
| 26 | 点击上一题时 |
| 27 | 点击下一题时 |
| 28 | 点击我不会了跳过时 |
| 29 | 点击麦克风按钮时 |
| 30 | 点击麦克风按钮取消时 |
| 31 | 点击麦克风按钮发送时 |
| 32 | 点击返回主页时 |
| 33 | 点击查看题目时 |
| 34 | 点击选过的题目跳转时 |
800 - 交易相关流程
| subId | subName |
|---|---|
| 1 | 点击 S1 季度包入口时 |
| 17 | 点击「我的订单」入口时 |
| 22 | 点击活动入口「完课福利」时 |
| 29 | 点击主框架底部的 S2 按钮时 |
900 / 1000 / 1100 / 1200 / 1300
这几个埋点的 buryingPointName 和 buryingPointSubName 均为空字符串,属于较新的埋点,尚未在数据中写入名称字段。只有数字ID可区分。
总结: 已命名的核心模块是 100(登录创角)、200(新手引导)、300(关卡)、400(组件)、500(主框架)、600(收集页)、700(知识模块)、800(交易)。900~1300 是较新添加的埋点,名称字段为空,需要结合客户端代码才能确认具体含义。 user: [message_id: om_x100b6cfa9e89c4bcb39e400681a27a5] 李承龙: [Replying to: "由于 buryingPointName 和 buryingPointSubName 字段是 index: false(不可检索/聚合),我需要通过查文档来获取它们的实际值:"]
查的什么文档 Reply target of current user message (untrusted, for context):
{
"body": "由于 buryingPointName 和 buryingPointSubName 字段是 index: false(不可检索/聚合),我需要通过查文档来获取它们的实际值:"
}
assistant: 抱歉表述不准确。这里说的"查文档"不是指什么外部文档,而是指 直接从 ES 索引中取样本数据(document)。
因为 buryingPointName 和 buryingPointSubName 这两个字段被设置为 index: false,意味着:
- ❌ 不能对它们做
terms聚合(无法直接列出所有枚举值) - ❌ 不能用它们做搜索/过滤
所以我的做法是:按每个 buryingPointId(这个字段可聚合)分别取一条原始记录(ES document),从返回的 _source 里读出对应的 buryingPointName 和 buryingPointSubName 字段值。
本质就是:用可检索的 ID 字段做查询条件 → 取返回的原始文档 → 读里面不可检索的 name 字段。 user: [message_id: om_x100b6cfa94e298b0b20966c5200f3ae] 李承龙: 统计一下埋点id1100,子id1,有多少用户,以及有多少次 assistant: 埋点 ID=1100,子 ID=1:
- 总次数: 8,281 次
- 去重用户数(accountId): 5,216 人