删除mongo数据库大文件,增加忽略配置
自然语言(语音 / 文本)→ 结构化查询条件 → MongoDB 查询 基于 Flask + MongoDB,内置学生信息管理模块
本项目实现了一个 通用语言查询系统:用户用自然语言说出(或输入)一句查询诉求,例如
「我要查询性别为男,年龄小于18岁的所有学生信息」
系统会自动完成:文本清洗 → 列名识别 → 运算符识别 → 条件切分 → 多条件逻辑组合 → 生成查询语句 → 执行查询并返回结果表格。
实现上做了两层设计:
COLUMN_LABELS
COLUMN_ALIASES
COLLECTION_SCHEMA
附带一个 学生信息管理 模块(增删改查 + 分页 + 关键词搜索 + 表单校验),作为查询的数据来源与功能对照。
/
/add
/edit/<student_id>
/view/<student_id>
/delete/<student_id>
表单校验规则(student_crud.validate_student):
student_crud.validate_student
1[3-9]\d{9}
/query
/api/tables
/api/columns/<table_name>
/api/operators?type=
/api/parse
/api/build_where
/api/query
/api/speech
界面操作流程:语音/文本输入 → 解析为查询条件 → 条件行可视化编辑(列名 / 运算符 / 值 / 逻辑符)→ 生成 WHERE → 执行查询。
students
student_id
name
gender
age
major
class_name
email
phone
address
enrollment_date
student_view
college_name
student_view 的生成方式:遍历 students,按 MAJOR_COLLEGE_MAP(专业 → 学院)补全 college_name 后整体重建。学生数据发生增删改时,app.py 会自动调用 sync_student_view() 保持视图同步。
MAJOR_COLLEGE_MAP
app.py
sync_student_view()
voice_parser.py
支持的中文表达(OP_PATTERNS):
OP_PATTERNS
>=
<=
>
<
!=
=
Like
Is
解析流程中的关键处理:
性别为男专业为计算机科学
性别为男
专业为计算机科学
chinese_to_arabic()
二十 → 20
十八 → 18
男生 / 男性 / 男的 → 男
并且 / 而且 / 以及 / 同时 / 和 / 且
and
或者 / 或
or
query_builder.py
build_where_sql(...)
性别='男' and 年龄<18
build_where_for_execution(...)
conditions_to_mongo_filter
{"$regex": pattern, "$options": "i"}
%
.*
NULL
$or[{field: None}, {field: {$exists: False}}]
NOT NULL
{"$exists": True, "$ne": None}
$or
not
$and
$nor
int
float
speech_service.py
提供两种语音转文本方式,前端会根据配置自动选择:
浏览器 Web Speech API(默认,无需任何配置)——static/js/main.js 中直接调用,适合 Chrome / Edge。
static/js/main.js
百度短语音识别(服务端 STT,可选)——配置环境变量后启用,前端录音上传到 /api/speech,后端调用百度 vop.baidu.com/server_api 识别。需要配置:
vop.baidu.com/server_api
set BAIDU_APP_ID=你的AppID set BAIDU_API_KEY=你的APIKey set BAIDU_SECRET_KEY=你的SecretKey
三项均配置时,界面显示绿色 百度 STT 徽标;否则显示 Web Speech API 徽标。access_token 已做内存缓存(提前 60 秒过期)。
百度 STT
Web Speech API
flask-pymongo
pymongo
venv
通用语言查询系统/ ├── app.py # Flask 入口:路由、学生管理、查询 API ├── config.py # 配置:MongoDB 连接、集合名、百度语音密钥 ├── database.py # MongoDB 操作:集合元数据、示例数据、视图同步、查询执行 ├── query_builder.py # 运算符定义、WHERE 串构造、MongoDB 过滤器生成 ├── voice_parser.py # 自然语言 → 查询条件解析器 ├── speech_service.py # 百度短语音识别封装(可选) ├── student_crud.py # 学生增删改查与表单校验 ├── init_view.py # 手动重建 student_view 集合 ├── test_parser.py # 解析器测试脚本(含无标点连读用例) ├── start.bat # 一键启动:拉起 MongoDB + 虚拟环境 + Flask ├── data/ # 本地 MongoDB 数据目录(start.bat 使用 data\mongo) ├── static/ │ ├── css/ │ │ ├── style.css # 全局样式 │ │ └── query.css # 语音查询页样式 │ └── js/ │ └── main.js # 语音输入、条件行 UI、API 交互 ├── templates/ │ ├── base.html # 基础布局(导航栏 + flash 消息) │ ├── students/ │ │ ├── list.html # 学生列表 │ │ ├── _form.html # 表单片段 │ │ ├── add.html / edit.html │ │ └── view.html # 学生详情 │ └── query/ │ └── index.html # 语音查询主界面 ├── 通用语言查询系统设计文档.docx └── 安装部署说明.pdf
Python 依赖包:
flask flask-pymongo pymongo
双击 start.bat,脚本会依次完成:
start.bat
27017
MongoDB
C:\Program Files\MongoDB\Server\{8.0,7.0,6.0,5.0}\bin\mongod.exe
data\mongo
127.0.0.1:27017
requirements.txt
注意:脚本会执行 pip install -r requirements.txt,但当前仓库中 未包含该文件。请先手动创建 requirements.txt:
pip install -r requirements.txt
flask>=2.3 flask-pymongo>=2.3.0 pymongo>=4.0
# 1. 确认 MongoDB 已启动(默认 127.0.0.1:27017) # 2. 创建并激活虚拟环境 python -m venv venv venv\Scripts\activate # Windows # source venv/bin/activate # macOS / Linux # 3. 安装依赖 pip install flask flask-pymongo pymongo # 4. 启动应用 python app.py
启动成功后控制台输出:
MongoDB 连接成功:mongodb://127.0.0.1:27017/homework4_db?serverSelectionTimeoutMS=5000 ================================================== 作业4 启动成功 学生管理: http://127.0.0.1:5000 语音查询: http://127.0.0.1:5000/query ==================================================
访问地址:
首次启动时会自动执行 init_db():
init_db()
ping
若视图数据与主表不一致,可手动重建:
python init_view.py
配置集中在 config.py,全部支持环境变量覆盖:
config.py
MONGO_DB_NAME
homework4_db
MONGO_HOST
127.0.0.1
MONGO_PORT
MONGO_URI
QUERY_TABLE
MONGO_COLLECTIONS
students,student_view
BAIDU_APP_ID
BAIDU_API_KEY
BAIDU_SECRET_KEY
SECRET_KEY
voice-query-dev-key
其他:Flask 监听 0.0.0.0:5000,开启 debug=True。
0.0.0.0:5000
debug=True
在 /query 页面选择集合 students,点击「语音输入」或直接在文本框输入:
性别='男' and 专业='计算机科学'
性别='女' and 年龄<20
邮箱 IS NULL
姓名 LIKE '%张%'
切换到 student_view 集合还可以按扩展字段查询:
学院='计算机学院' and 专业='计算机科学'
也可以运行内置测试脚本验证解析逻辑:
python test_parser.py
1. 启动提示「MongoDB 连接失败」 确认本机 MongoDB 已启动(net start MongoDB,或用 start.bat 自动拉起),并检查 27017 端口是否被占用。
net start MongoDB
2. start.bat 报找不到 requirements.txt 该文件当前未随仓库提供,请按 6.2 节内容手动创建。
3. 语音输入按钮无反应 / 无法识别 浏览器 Web Speech API 需要 Chrome 或 Edge,且页面须通过 localhost / 127.0.0.1 或 HTTPS 访问。若配置了百度 STT,则走服务端识别,请确认三项环境变量均已填写。
localhost
4. 查询结果中的日期显示异常 后端统一将时间格式化为北京时间字符串(Asia/Shanghai,无 tzdata 时回退固定东八区)。数据库中 naive 时间按字面值显示,带时区的时间会转为东八区。
Asia/Shanghai
tzdata
5. 中文乱码(Windows 控制台) start.bat 已执行 chcp 65001 并设置 PYTHONIOENCODING=utf-8,手动启动时建议同样设置。
chcp 65001
PYTHONIOENCODING=utf-8
6. 学生数据改动后视图未更新 正常路径下增删改会自动同步 student_view;若通过其他方式直接改库,请执行 python init_view.py 重建。
execute_query
limit
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
通用语言查询系统
自然语言(语音 / 文本)→ 结构化查询条件 → MongoDB 查询
基于 Flask + MongoDB,内置学生信息管理模块
一、项目简介
本项目实现了一个 通用语言查询系统:用户用自然语言说出(或输入)一句查询诉求,例如
系统会自动完成:文本清洗 → 列名识别 → 运算符识别 → 条件切分 → 多条件逻辑组合 → 生成查询语句 → 执行查询并返回结果表格。
实现上做了两层设计:
COLUMN_LABELS/COLUMN_ALIASES/COLLECTION_SCHEMA及实际抽样数据)动态推断,界面上的「集合名」可随时切换。附带一个 学生信息管理 模块(增删改查 + 分页 + 关键词搜索 + 表单校验),作为查询的数据来源与功能对照。
二、功能模块
1. 学生信息管理
//add/edit/<student_id>/view/<student_id>/delete/<student_id>表单校验规则(
student_crud.validate_student):1[3-9]\d{9}手机号)2. 通用语音查询
/query/api/tables/api/columns/<table_name>/api/operators?type=/api/parse/api/build_where/api/query/api/speech界面操作流程:语音/文本输入 → 解析为查询条件 → 条件行可视化编辑(列名 / 运算符 / 值 / 逻辑符)→ 生成 WHERE → 执行查询。
三、核心能力说明
3.1 数据模型
studentsstudent_id、name、gender、age、major、class_name、email、phone、address、enrollment_datestudent_viewstudents汇总生成的宽表集合,额外包含college_name(学院),用于模拟「多表先建视图再查询」的场景student_view的生成方式:遍历students,按MAJOR_COLLEGE_MAP(专业 → 学院)补全college_name后整体重建。学生数据发生增删改时,app.py会自动调用sync_student_view()保持视图同步。3.2 自然语言解析(
voice_parser.py)支持的中文表达(
OP_PATTERNS):>=<=><!==LikeIs解析流程中的关键处理:
性别为男专业为计算机科学→性别为男|专业为计算机科学。chinese_to_arabic()支持二十 → 20、十八 → 18,同时兼容「18岁」这类带单位的写法。男生 / 男性 / 男的 → 男,并处理连读后残留的「男专业」只取单字。并且 / 而且 / 以及 / 同时 / 和 / 且解析为and,或者 / 或解析为or。college_name,「男女」→gender)。3.3 查询构造(
query_builder.py)Is,文本型支持=、!=、Like、Is。build_where_sql(...)→ 中文标签 WHERE 串,如性别='男' and 年龄<18(用于界面展示)build_where_for_execution(...)→ 英文字段 WHERE 串(用于对照)conditions_to_mongo_filter):Like→{"$regex": pattern, "$options": "i"}(%通配符转为.*)Is→NULL走$or[{field: None}, {field: {$exists: False}}];NOT NULL走{"$exists": True, "$ne": None}or逻辑合并进$or数组,not逻辑转为$and+$norint/float)3.4 语音输入(
speech_service.py)提供两种语音转文本方式,前端会根据配置自动选择:
浏览器 Web Speech API(默认,无需任何配置)——
static/js/main.js中直接调用,适合 Chrome / Edge。百度短语音识别(服务端 STT,可选)——配置环境变量后启用,前端录音上传到
/api/speech,后端调用百度vop.baidu.com/server_api识别。需要配置:三项均配置时,界面显示绿色
百度 STT徽标;否则显示Web Speech API徽标。access_token 已做内存缓存(提前 60 秒过期)。四、技术栈
flask-pymongo/pymongo)venv)五、目录结构
六、快速开始
6.1 环境要求
Python 依赖包:
6.2 方式一:一键启动(Windows,推荐)
双击
start.bat,脚本会依次完成:27017端口是否已有 MongoDB 在监听;MongoDB,失败则用C:\Program Files\MongoDB\Server\{8.0,7.0,6.0,5.0}\bin\mongod.exe以data\mongo为数据目录、127.0.0.1:27017启动本地实例;venv;requirements.txt中的依赖;6.3 方式二:手动启动
启动成功后控制台输出:
访问地址:
6.4 首次运行说明
首次启动时会自动执行
init_db():ping检测 MongoDB 连接;students集合为空,写入 6 条示例学生数据(张三、李四、王五、赵六、陈七、刘八);sync_student_view()生成student_view宽表集合。若视图数据与主表不一致,可手动重建:
七、配置项
配置集中在
config.py,全部支持环境变量覆盖:MONGO_DB_NAMEhomework4_dbMONGO_HOST127.0.0.1MONGO_PORT27017MONGO_URIQUERY_TABLEstudentsMONGO_COLLECTIONSstudents,student_viewBAIDU_APP_ID/BAIDU_API_KEY/BAIDU_SECRET_KEYSECRET_KEYvoice-query-dev-key其他:Flask 监听
0.0.0.0:5000,开启debug=True。八、使用示例
在
/query页面选择集合students,点击「语音输入」或直接在文本框输入:性别='男' and 年龄<18性别='男' and 专业='计算机科学'性别='女' and 年龄<20邮箱 IS NULL姓名 LIKE '%张%'切换到
student_view集合还可以按扩展字段查询:学院='计算机学院' and 专业='计算机科学'也可以运行内置测试脚本验证解析逻辑:
九、常见问题
1. 启动提示「MongoDB 连接失败」 确认本机 MongoDB 已启动(
net start MongoDB,或用start.bat自动拉起),并检查 27017 端口是否被占用。2.
start.bat报找不到requirements.txt该文件当前未随仓库提供,请按 6.2 节内容手动创建。3. 语音输入按钮无反应 / 无法识别 浏览器 Web Speech API 需要 Chrome 或 Edge,且页面须通过
localhost/127.0.0.1或 HTTPS 访问。若配置了百度 STT,则走服务端识别,请确认三项环境变量均已填写。4. 查询结果中的日期显示异常 后端统一将时间格式化为北京时间字符串(
Asia/Shanghai,无tzdata时回退固定东八区)。数据库中 naive 时间按字面值显示,带时区的时间会转为东八区。5. 中文乱码(Windows 控制台)
start.bat已执行chcp 65001并设置PYTHONIOENCODING=utf-8,手动启动时建议同样设置。6. 学生数据改动后视图未更新 正常路径下增删改会自动同步
student_view;若通过其他方式直接改库,请执行python init_view.py重建。十、说明
and/or组合,暂不支持括号嵌套的多层逻辑。execute_query的limit参数)。