背景:我正在尝试使用流行的“标准”医学编码系统,该系统提供预制的“关键字”表,并使用定义明确的映射。
简单来说,基本上它会获取文本描述中的每个单词并将其映射到更短的标准化关键字,如下所示:
数据记录 id:描述
* 10 : Gonkulator-2500 image reconstruction
* 11 : DICOM image upload
* 12 : SpiffyCont Image Interface
将映射到关键字索引,如下所示:
关键字:rec_id
* GONKU : 10
* IMAGE : 10
* RECON : 10
* DICOM : 11
* IMAGE : 11
* UPLOA : 11
* SPIFF : 12
* IMAGE : 12
* INTER : 12
处理此问题的最简单(编码)方法显然是以相同方式将用户搜索输入简单地映射到关键字并执行 AND 查询。
不过,我正在寻找的是通过能够返回部分匹配来提高可用性的东西,以便感到困惑并搜索“Gonkulator-2500 image upload”的用户不会得到空白结果,但是“最近的点击”
* Gonkulator-2500 image reconstruction (66%)
* DICOM image upload (66%)
* SpiffyCont Image Interface (33%)
据我所知,我需要按照 record_id:matches 顺序的结果
* 10: 2
* 11: 2
* 12: 1
我很感激任何有关如何做到这一点的想法或指示,但是有关数据库规范化的讲座应该更正确地针对各个国际标准组织。 :)
更新:我忘了提及(我本来打算这样做。FFB 综合症再次发作)我的第一个想法是子查询:
SELECT rec_id, count(keyword) as matches
FROM (
SELECT keyword, rec_id FROM index_tbl
WHERE keyword = 'KEY1' OR keyword = 'KEY2' OR ...etc
)
GROUP BY rec_id;
但是 ISTR 认为 mysql 不能很好地处理子查询,尤其是在巨大的表(1M+ 记录)上。也就是说,它弄脏了自己,然后窒息而死。
最佳答案
我猜你没有忘记在表上放置索引?实际上(除非我没有遗漏什么)你在这里不需要子查询。
SELECT rec_id, count(keyword) as matches FROM index_tbl WHERE keyword = 'KEY1' ... GROUP BY rec_id;
关于php - 如何实现多个关键词的映射关键词匹配以及基于点击次数的偏好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584527/