本功能实现了基于中文分词的医院信息智能搜索,通过对医院名称、地址等信息进行分词处理,支持模糊匹配和权重排序,大幅提升医院搜索的准确性和用户体验。
sql/tb_hosp_data_add_keywords.sqltb_hosp_data 表中添加 hosp_keywords 字段sql ALTER TABLEtb_hosp_data ADD COLUMNhosp_keywords` varchar(500) DEFAULT NULL COMMENT '医院信息分词(逗号分隔)';CREATE INDEX idx_hosp_keywords ON tb_hosp_data(hosp_keywords);
```
ruoyi-system/src/main/java/com/ruoyi/system/domain/TbHospData.javahospKeywords - 医院信息分词(逗号分隔)ruoyi-common/src/main/java/com/ruoyi/common/utils/HospitalTokenizerUtil.java// 对搜索文本进行分词
public static String tokenizeSearchText(String text)
// 计算两个分词集合的匹配度
public static int calculateMatchScore(String keywords1, String keywords2)
```
ruoyi-system/src/main/java/com/ruoyi/system/service/ITbHospDataService.java// 为单个医院生成分词
String generateKeywordsForHospital(TbHospData tbHospData);
```
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbHospDataServiceImpl.javaruoyi-system/src/main/java/com/ruoyi/system/service/impl/HospDataSyncServiceImpl.javaruoyi-admin/src/main/java/com/ruoyi/web/controller/system/HospDataController.javaGET /system/hospital/generateKeywordsGET /system/hospital/searchByKeywordssearchText (必填): 搜索文本(医院名称、地址等)pageSize (可选): 返回结果数量,默认 50json { "code": 200, "msg": "查询成功", "data": [ { "hospId": 1001, "hospName": "北京协和医院", "hospShort": "协和医院", "hopsProvince": "北京市", "hopsCity": "北京市", "hopsArea": "东城区", "hospAddress": "东城区帅府园1号" }, // ... 更多医院数据(按匹配度排序) ] } ruoyi-system/src/main/resources/mapper/system/TbHospDataMapper.xmlhospKeywords 字段映射hosp_keywords 字段hosp_keywords 字段执行数据库脚本
bash mysql -u用户名 -p数据库名 < sql/tb_hosp_data_add_keywords.sql
重启应用
bash ./ry.sh restart # 或 Windows 下 ry.bat
初始化分词数据
调用批量生成分词接口:
bash GET http://localhost:8080/system/hospital/generateKeywords
// 在 uni-app 中调用
uni.request({
url: '/system/hospital/searchByKeywords',
method: 'GET',
data: {
searchText: '北京协和东城区',
pageSize: 20
},
success: (res) => {
if (res.data.code === 200) {
// 医院列表已按匹配度排序
const hospitals = res.data.data;
console.log('找到医院:', hospitals.length);
}
}
});
// 在 Vue 组件中
methods: {
async searchHospitals(searchText) {
try {
const response = await this.$http.get('/system/hospital/searchByKeywords', {
params: {
searchText: searchText,
pageSize: 50
}
});
if (response.data.code === 200) {
this.hospitals = response.data.data;
// 数据已按匹配度排序,匹配越好的医院越靠前
}
} catch (error) {
console.error('搜索失败:', error);
}
}
}
自动过滤以下常见停用词:
- 通用词: "医院"、"诊所"、"卫生"、"院"
- 地区词: "市"、"省"、"县"、"区"、"镇"、"乡"
- 位置词: "街道"、"路"、"号"、"栋"、"单元"、"室"、"层"、"楼"
- 连接词: "的"、"了"、"在"、"与"、"和"、"及"等
hosp_keywords 字段上创建索引,提升查询性能pageSize 参数限制返回数量,减少网络传输/generateKeywords 接口初始化所有医院的分词数据HospitalTokenizerUtil 中调整停用词列表如有问题或建议,请联系开发团队。
文档版本: v1.0
更新日期: 2026-01-20
开发者: RuoYi Team