我正在尝试对SELECT语句的整个部分进行评分
SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
UNION
SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
UNION
SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
在这种情况下,分数是每张桌子的分数+它们不是按相关性排序的
但是我尝试了这种方法,这种方法虽然有效,但不值得生产
SELECT * FROM (
SELECT *,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
UNION
SELECT *,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
UNION
SELECT *,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
) as `combined` ORDER BY `score` DESC
上面的代码是不受欢迎的,因为每个表都有分数,它们是按顺序排列的。不好的方法。
于是,我就MATCH() AGAINST()
为data
在顶级SELECT以及这一点。(不工作)
SELECT *,MATCH(`data`) AGAINST('keyword') as `good_score` FROM (
SELECT *,`result` as `data`,MATCH(`result`) AGAINST('keyword') as `score` FROM `table1` WHERE MATCH(`result`) AGAINST('keyword')
UNION
SELECT *,`content` as `data`,MATCH(`content`) AGAINST('keyword') as `score` FROM `table2` WHERE MATCH(`content`) AGAINST('keyword')
UNION
SELECT *,`text` as `data`,MATCH(`text`) AGAINST('keyword') as `score` FROM `table3` WHERE MATCH(`text`) AGAINST('keyword')
) as `combined` ORDER BY `good_score` DESC
上面的语句对我来说是完美的,但是它不起作用,因为该data
列是即时创建的,并且不支持具有FULLTEXT INDEX。
我的问题是如何继续使发动机运转。
- 你能以某种方式使
data
一个FULLTEXT - 除了不支持得分的IN BOOLEAN MODE之外,还有其他方法可以使它工作吗
- 是否有一种方法可以解决整个主题?创建临时表不能解决此问题,MATCH()AGAINST()的50%规则会使查询返回0个结果,但是有很多结果
- 也许我想念一些东西?
- 创建VIEW也不起作用,MySQL不支持VIEW上的INDEX-es。
- 使用IN BOOLEAN MODE并手动创建计分也许是个好主意?
我已经为这个问题工作了两天以上。因此,请您提供一些帮助。谢谢。