Estou tentando obter uma pontuação para a seção inteira das instruções 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')
Nesse caso, as pontuações são por tabela + não são ordenadas por relevância
Mas eu tentei esse método, que está funcionando, mas não vale a pena produzir
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
O código acima não é apreciado porque as pontuações existem por tabela, elas são unidas e ordenadas. Uma péssima abordagem.
Então, eu tentei MATCH() AGAINST()
para data
no TOP LEVEL SELECT como bem isso. (NÃO TRABALHOU)
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
A declaração acima é perfeita para mim, mas não funciona porque a data
coluna é criada on-the-fly e não suporta ter um ÍNDICE FULLTEXT.
Minha pergunta é como proceder para colocar meu motor em funcionamento.
- Você pode de alguma forma fazer
data
um FULLTEXT - Existe alguma maneira de fazê-lo funcionar diferente do IN BOOLEAN MODE que não suporta pontuações
- Existe uma abordagem para todo esse tópico que o faça funcionar? Criar uma tabela temporária não resolve isso; a regra de 50% de MATCH () AGAINST () faz com que uma consulta retorne 0 resultados, mas há muitos
- Talvez exista algo que eu sinta falta?
- Criar uma VIEW também não funciona, o MySQL não suporta INDEX-es em VIEWs.
- Talvez seja uma boa ideia usar o IN BOOLEAN MODE e criar a pontuação manualmente?
Estou trabalhando para esse problema há mais de dois dias. Por isso, peço ajuda. Obrigado.
fonte