# 医院分词搜索功能 - 快速使用指南
## 一、部署步骤(4步完成)
### 步骤1: 集成 HanLP 分词库
**说明**: 已集成 HanLP 专业中文分词库,替代了简单的 N-Gram 算法,分词准确度更高。
在 `ruoyi-common/pom.xml` 中已添加:
```xml
com.hankcs
hanlp
portable-1.8.4
```
### 步骤2: 执行数据库脚本
```bash
# 进入 SQL 目录
cd sql
# 1. 执行脚本添加分词字段
mysql -uroot -p你的密码 你的数据库名 < tb_hosp_data_add_keywords.sql
# 2. 添加后台菜单权限
mysql -uroot -p你的密码 你的数据库名 < hospital_tokenizer_menu.sql
```
### 步骤3: 重启应用
```bash
# Linux/Mac
./ry.sh restart
# Windows
ry.bat
```
### 步骤4: 使用后台测试界面初始化分词
**方式1: 通过后台界面(推荐)**
1. 登录后台管理系统
2. 进入菜单:**系统管理 > 医院管理 > 医院分词测试**
3. 点击「**批量生成所有医院分词**」按钮
4. 等待生成完成
**方式2: 通过 API 接口**
使用 Postman 或浏览器访问:
```
GET http://localhost:8080/system/hospital/generateKeywords
```
等待返回结果,显示成功生成的医院数量。
---
## 二、后台测试界面使用
### 访问路径
**系统管理 > 医院管理 > 医院分词测试**
### 功能说明
#### 1. 批量分词管理
- **功能**: 为所有医院批量生成分词数据
- **使用场景**:
- 首次部署时初始化
- 分词算法升级后重新生成
- 数据修复后更新
- **操作**: 点击「批量生成所有医院分词」按钮
- **耗时**: 根据医院数量,通常需要 1-5 分钟
#### 2. 医院匹配测试
- **功能**: 测试分词搜索效果
- **使用方法**:
1. 在搜索框输入医院名称、地址或关键词
2. 设置返回结果数量(默认 30 条)
3. 点击「搜索」按钮
4. 查看匹配结果(按相关度排序)
#### 3. 测试示例
```
输入: "北京协和医院"
结果: 显示所有包含“北京”和“协和”的医院
输入: "上海瑞金医院卢湾区"
结果: 上海瑞金医院及其分院排在最前
输入: "人民医院朝阳区"
结果: 朝阳区的人民医院相关结果
```
### 界面截图说明
1. **批量分词区域**
- 展示提示信息
- 生成按钮(带 loading 状态)
- 结果显示(成功/失败)
2. **搜索测试区域**
- 搜索输入框
- 结果数量设置
- 分词结果展示(标签形式)
- 医院列表表格
- 统计信息
---
## 三、API 接口使用
### 接口1: 批量生成分词(管理员)
**接口**: `GET /system/hospital/generateKeywords`
**说明**: 批量为所有医院生成分词,用于初始化或重新生成
**请求示例**:
```bash
curl -X GET "http://localhost:8080/system/hospital/generateKeywords"
```
**返回示例**:
```json
{
"code": 200,
"msg": "成功生成 1523 个医院的分词"
}
```
---
### 接口2: 分词搜索医院(核心功能)
**接口**: `GET /system/hospital/searchByKeywords`
**参数**:
| 参数 | 类型 | 必填 | 说明 | 示例 |
|-----|------|------|------|------|
| searchText | String | 是 | 搜索文本 | "北京协和东城区" |
| pageSize | Integer | 否 | 返回数量,默认50 | 20 |
**请求示例**:
```bash
# 搜索 "北京协和医院"
curl -X GET "http://localhost:8080/system/hospital/searchByKeywords?searchText=北京协和医院&pageSize=20"
# 搜索 "上海瑞金"
curl -X GET "http://localhost:8080/system/hospital/searchByKeywords?searchText=上海瑞金"
```
**返回示例**:
```json
{
"code": 200,
"msg": "查询成功",
"data": [
{
"hospId": 1001,
"hospName": "北京协和医院",
"hospShort": "协和医院",
"hopsProvince": "北京市",
"hopsCity": "北京市",
"hopsArea": "东城区",
"hospAddress": "东城区帅府园1号",
"hospTel": "010-69156114"
},
{
"hospId": 1002,
"hospName": "首都医科大学附属北京协和医院西院",
"hospShort": "协和西院",
"hopsProvince": "北京市",
"hopsCity": "北京市",
"hopsArea": "西城区",
"hospAddress": "西城区大木仓胡同41号"
}
// ... 更多匹配结果(按匹配度自动排序)
]
}
```
---
## 四、前端集成示例
### uni-app 集成
```javascript
// 在你的页面或组件中
export default {
data() {
return {
searchText: '',
hospitals: []
}
},
methods: {
// 搜索医院
searchHospitals() {
if (!this.searchText.trim()) {
uni.showToast({
title: '请输入搜索内容',
icon: 'none'
});
return;
}
uni.showLoading({ title: '搜索中...' });
uni.request({
url: this.$baseUrl + '/system/hospital/searchByKeywords',
method: 'GET',
data: {
searchText: this.searchText,
pageSize: 30
},
success: (res) => {
uni.hideLoading();
if (res.data.code === 200) {
this.hospitals = res.data.data;
console.log('找到医院:', this.hospitals.length);
if (this.hospitals.length === 0) {
uni.showToast({
title: '未找到匹配的医院',
icon: 'none'
});
}
} else {
uni.showToast({
title: res.data.msg || '搜索失败',
icon: 'none'
});
}
},
fail: (err) => {
uni.hideLoading();
uni.showToast({
title: '网络请求失败',
icon: 'none'
});
console.error('搜索失败:', err);
}
});
},
// 选择医院
selectHospital(hospital) {
// 将选中的医院信息回填到表单
console.log('选择了医院:', hospital.hospName);
// 你的业务逻辑...
}
}
}
```
### Vue.js + Axios 集成
```javascript
// 在 Vue 组件中
选择
```
---
## 五、功能说明
### 1. 分词特点
- **HanLP 专业分词**: 使用业界通用的 HanLP 中文分词库
- **智能分词**: 自动将医院名称、地址等分解为多个关键词
- **停用词过滤**: 过滤“医院”、“市”、“省”等常见词
- **降级方案**: HanLP 失败时自动降级到 N-Gram 算法
- **支持模糊匹配**: 输入部分关键词即可匹配
### 2. 权重排序
- 匹配的关键词越多,排名越靠前
- 完全匹配优先于部分匹配
- 自动按相关度排序,无需手动筛选
### 3. 使用场景
- ✅ 用户输入 "北京协和" → 匹配所有带"北京"和"协和"的医院
- ✅ 用户输入 "东城区人民" → 匹配"东城区"和"人民"相关的医院
- ✅ 用户输入 "瑞金医院卢湾" → 匹配上海瑞金医院及其分院
---
## 六、常见问题
### Q1: 首次部署后搜索不到任何结果?
**A**: 需要先调用 `/generateKeywords` 接口初始化分词数据。
### Q2: 新增或修改医院后需要重新生成分词吗?
**A**: 不需要。系统会自动在新增/修改/同步医院时生成分词。
### Q3: 搜索速度慢怎么办?
**A**:
1. 确认已经在 `hosp_keywords` 字段上创建索引
2. 适当减小 `pageSize` 参数值
3. 考虑增加服务器内存
### Q4: 后台菜单看不到“医院管理”?
**A**:
1. 确认执行了 `hospital_tokenizer_menu.sql` 脚本
2. 在“系统管理 > 角色管理”中,给当前角色分配菜单权限
3. 重新登录后台系统
### Q5: HanLP 分词库下载慢怎么办?
**A**:
1. 使用阿里云或腾讯云 Maven 镜像
2. 或者手动下载 HanLP jar 包放到本地 Maven 仓库
### Q6: 如何优化搜索准确度?
**A**:
1. 调整 `HospitalTokenizerUtil` 中的停用词列表
2. 根据业务需求添加医院别名映射
3. 使用后台测试界面反复测试和调优
---
## 七、维护建议
### 定期维护
```bash
# 建议每月重新生成一次分词(可选)
GET /system/hospital/generateKeywords
```
### 监控日志
查看应用日志中的分词生成信息:
```bash
tail -f logs/sys-info.log | grep "医院分词"
```
### 数据备份
```bash
# 定期备份医院数据
mysqldump -u用户名 -p数据库名 tb_hosp_data > hosp_data_backup.sql
```
---
## 七、技术支持
如遇到问题,请检查:
1. 数据库字段是否正确添加
2. 应用是否正常重启
3. 分词数据是否已初始化
4. 接口权限是否配置正确
详细技术文档请参考: `医院信息分词搜索功能说明.md`
---
**版本**: v1.0
**更新日期**: 2026-01-20