我正在尝试使用多列进行全文搜索。这不是我的问题。我对不同的列有不同的相关性。到目前为止没问题。
起初我告诉你我的桌子。它更容易解释
ID | course_name | course_level | duration | place
--------------------------------------------------------
1 |math, physics|6 |3 months |Spaichingen
2 |physics |6 |4 months |Spaichingen
3 |math |7 |3 months |Spaichingen
4 |physics |7 |5 months |Spaichingen
5 |math |6 |3 months |Trossingen
6 |physics |6 |4 months |Trossingen
7 |math |7 |3 months |Spaichingen
8 |math |7 |5 months |Spaichingen
如果我正在寻找Math 7课程,我可以使用如下的where子句:
... WHERE course_level = '7'
使用Match-Against我可以搜索和过滤数学。这个地方,如果课程是与其他科目的组合无关紧要。如果你寻找数学6和物理6,第一门课程(id = 1)得分最高,等等。
我如何计算分数并不重要。我唯一的问题是如果我想搜索数学7并且持续时间应该是5个月,则记录8应该具有比记录7更高的分数。但问题是全文搜索不能使文本与数值。月份这个词仍然是一样的。持续时间得分相同。
有没有比使用三个月,四个月等更好的解决方案?
抱歉我的英语不好。这只是一个简单的例子,它显示了全文搜索的问题。数值也可能用于其他情况。
答案 0 :(得分:0)
评论太长了。修复您的数据模型!
在单个列中存储多个值不是使用关系数据库的正确方法。相反,创建一个表,每个课程ID一行," topic" (这似乎比名字更合适:
create table course_topics (
course_topic_id int auto_increment primary key,
course_id int not null,
topic varchar(255)
);
然后,您可以将其与未命名的表格结合使用,我将称之为courses
:
select . . .
from courses c join
course_topics ct
on ct.course_id = c.id
where c.course_level = 7 and
ct.topic = 'Math';
此查询可以利用索引,您不需要全文搜索。