SQL全文搜索整数值的解决方法

时间:2018-04-03 12:46:19

标签: mysql sql full-text-search

我正在尝试使用多列进行全文搜索。这不是我的问题。我对不同的列有不同的相关性。到目前为止没问题。

起初我告诉你我的桌子。它更容易解释

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更高的分数。但问题是全文搜索不能使文本与数值。月份这个词仍然是一样的。持续时间得分相同。

有没有比使用三个月,四个月等更好的解决方案?

抱歉我的英语不好。这只是一个简单的例子,它显示了全文搜索的问题。数值也可能用于其他情况。

1 个答案:

答案 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';

此查询可以利用索引,您不需要全文搜索。