J'essaie d'avoir un score pour toute la section des instructions 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')
Dans ce cas, les scores sont par table + ils ne sont pas classés par pertinence
Mais j'ai essayé cette méthode qui fonctionne mais qui ne vaut pas la peine d'être produite
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
Le code ci-dessus n'est pas apprécié car les scores sont par table, ils sont joints et ordonnés. Une mauvaise approche.
J'ai donc essayé MATCH() AGAINST()
pour data
en TOP NIVEAU SELECT et ce. (N'A PAS FONCTIONNÉ)
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
L'instruction ci-dessus est parfaite pour moi, mais elle ne fonctionne pas car la data
colonne est créée à la volée et elle ne prend pas en charge d'avoir un INDEX COMPLET.
Ma question est de savoir comment procéder pour faire fonctionner mon moteur.
- Pouvez-vous en quelque sorte faire
data
un FULLTEXT - Existe-t-il un moyen de le faire fonctionner autre qu'en mode booléen qui ne prend pas en charge les scores
- Existe-t-il une approche de tout ce sujet qui le ferait fonctionner? La création d'une table temporaire ne résout pas ce problème, la règle de 50% de MATCH () AGAINST () fait qu'une requête renvoie 0 résultats, mais il y en a beaucoup
- Peut-être qu'il y a un petit quelque chose qui me manque?
- La création d'une VIEW ne fonctionne pas non plus, MySQL ne prend pas en charge les INDEX sur les VIEW.
- Peut-être que c'est une bonne idée d'utiliser EN MODE BOOLÉEN et de créer un score manuellement?
Je travaille sur ce problème depuis plus de deux jours. Je demande donc de l'aide. Merci.
la source