info sur requete mysql MATCH () AGAINST()

Nouveau WRInaute
Bonjour,

j'ai un gros problème avec une requete !!
j'ai un moteur de recherche sur une base d'infos (+ de 22 000 enregistrement).

Les requetes du genre where titre LIKE '$kekchose' or texte LIKE '$kekchose' étant très lente, j'ai opté pour le FULLTEXT.
j'ai mis mes champs titre et texte en FULLTEXT et transformé mes requetes en :

where MATCH (titre,texte) AGAINST('$kekchose') => résultat pas pertinent du tout !!!, me sors des résultats ou il n'y as pas $kekchoses et des fois des résultats ou il y a $kekchoses de façon aléatoire.

De même, j'ai en parcourant internet transformé ma reuqte en
where MATCH (titre,texte) AGAINST('$kekchose' IN BOOLEAN MODE) => pas mieux,bref mon moteur de recherche est plus rapide mais carrément pas pertinant du tout.

Quelqun peut t'il m'éclairer sur le sujet... ?

Merci d'avance pour votre aide.
 
WRInaute impliqué
Salut,

Essaye avec qqch du genre :
Code:
SELECT ... FROM matable  WHERE MATCH (titre) AGAINST ('$kekchose')

Si tu peux éviter le mode booleen, evite le, ca va ralentir le moteur pour pas grand chose ...

Attention avec match against tu as des configurations à faire pour ne pas être piégé et avoir des retours pertinents (Fichier my.cnf):
- la longueur des expressions => ft_min_word_len
Cela permet de ne pas rechercher sur les mots de moins de 3 lettres par exemple
- certains mots sont rejetés, la liste se parametre avec la variable ft_stopword_file

La meilleur source d'info sur la question: http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html
 
WRInaute passionné
match retourne un nombre qui est d'autant plus grand que le résultat "match" :
Code:
where MATCH (titre,texte) AGAINST('$kekchose') > 10
Le 10 est a adapter à la hausse pour être plus précis.
 
Nouveau WRInaute
ça y'est, j'ai bien compris ce que tu m'as dit webmasterlamogere et du coup je peux mieux trier les résultats de mes requetes.

En revanche, les résultats ne sont toujours pas ce que j'attend ... :

MATCH est égale à 0 sur une requete ou je recherche un mot qui est bien dans le texte !!!!
ex : le mot "Millionnaire" , le titre de l'article : Millionnaire et seule, avec le loto...
la requete :

Code:
select  MATCH (titre) AGAINST (' Millionnaire '),texte,id,titre,date from articles WHERE  ( MATCH (titre) AGAINST (' Millionnaire ')) > 0 ORDER BY date DESC
sinon peut tu m'en dir plus totoro sur le fichier (Fichier my.cnf):

Bon, en tout cas merci pour votre aide, c'est déjà beaucoup mieux qu'au début :-) !

je continue...
 
WRInaute passionné
je te conseil de lire cette page : -http://dev.mysql.com/doc/refman/5.0/fr/fulltext-search.html

par exemple ce paragraphe :
Tous les mots corrects de la liste et de la requête sont pondérés en fonction de leur importance dans la liste ou la requête. De cette fa¸on, un mot présent dans de nombreuses lignes aura un poids faible (et peut être même un poids nul), car il a peu d'importance dans cette requête particulière. Au contraire, si le mot est rare, il recevra un poids fort. Le poids des mots sont alors rassemblés pour calculer la pertinence de la ligne...
 
WRInaute impliqué
Peut etre comme ça :
Code:
select titre, texte, id, titre, date FROM articles WHERE  ( MATCH (titre) AGAINST (' Millionnaire ')) ORDER BY date DESC

Pour le my.cnf le lien que je t'ai filé http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html reste la référence pour se dépanner ... Tu n'en a pas forcément besoin, mais il faut juste savoir que des mots clés (par exemple "after" "afterwards" "again" "against", "certain" ...).
 
Discussions similaires
Haut