我在这里查看问题,但找不到与我想要实现的内容完全匹配的答案......
基本上我有一个存储FAQ信息的SQL表。下面的表格以粗体显示主键。
表:问题, 字段: id_question ,问题,答案,状态等......
表:question_tags, 字段: id_question ,标记
表:标签, 字段:标记
question_tags表本质上是问题表和标签表之间的链接(即多对多)。
我想要做的是实现像SQL MATCH AGAINST这样的东西,所以当用户在搜索框(PHP)中输入问题时,系统会查找问题表并在搜索词中搜索关键字的问题。我可以让这个工作,但我希望能够做的是在搜索中包含标签。这样做的原因是我相信同一个问题可以使用不同的单词有多种不同的方式。标签应该在搜索时补充问题。我知道在SQL中使用MATCH AGAINST函数是不可能的,所以我有点卡住了。
有没有解决这个限制的方法?
或者不是像上面那样将每个标签放在一个单独的表(与第三个表链接)的单独列中,我是否应该在问题表中为整个标记字符串创建另一个字段?
或者其他人有其他建议吗?
该解决方案不会开始使用大型数据集,但如果解决方案具有可扩展性,则会有所帮助。
由于
答案 0 :(得分:0)
标签可能是此用例的非规范化的良好候选者。
一种可能性就像是
SELECT * FROM
(
SELECT Question, Answer, Status, MATCH(title,category) AGAINST ('keyword') as rank
FROM questions
WHERE MATCH(Question,Answer) AGAINST ('Keyword')
UNION
SELECT Question, Answer, Status, MATCH(Tag) AGAINST ('keyword')
FROM questions Q
INNER JOIN question_tags QT
ON Q.id_question = QT.id_question
INNER JOIN tags T
ON QT.id_tag = T.id_tag
WHERE MATCH(Tag) AGAINST ('keyword')
) R
ORDER BY rank
基本上对问题/答案进行FT搜索,在标签上进行另一次搜索,并对结果集进行联合,然后按等级排序。