Moteur de recherche fulltext et performances ?

Eléphant du PHP | 209 Messages

05 sept. 2008, 11:42

Salut,

je dois réaliser un moteur de recherche fulltext, et comme j'utilise MyISAM de MySQL, il n'y aurait normalement pas de problème... d'ailleurs, il n'y a aucun problème tout fonctionne bien.
Cependant, je me pose la question des performances, en effet, je fais mes tests sur un nombre réduit d'enregistrement et niveau performances ça à l'air plus que correct, mais qu'est-ce que ça va donner lorsqu'il y aura 10Mo de texte à parcourir pour la recherche.

J'ai déjà réduit le nombre de résultats de la recherche en n'autorisant pas les mots trop longs.
Par contre, je voudrais classer les résultats par pertinence et que la pertinence soit indiquer en pourcentage.
J'utilise pour ça la requête suivante :

Code : Tout sélectionner

"SELECT articles.*, (MATCH (texte,titre) AGAINST ('$mots' IN BOOLEAN MODE) as pertinence FROM articles WHERE ( MATCH (texte, titre) AGAINST ('$mots' IN BOOLEAN MODE) ) HAVING pertinence > $seuil ORDER BY pertinence DESC LIMIT $debut,$limit";



Où $debut et $limit dépendent de la page sur laquelle on se trouve.
Ce que je voudrais en fait c'est réduire le nombre de résultats trouvés en fonction de la pertinence, si la pertinence est en dessous d'un certain seuil on arrête la recherche.
Voila en gros, seul problème : je ne sais pas comment est calculée la pertinence (entre quoi et quoi varie-t-elle ?) et donc je ne sais pas choisir la variable $seuil...
Donc est-il possible d'obtenir la pertinence directement en pourcentage ou faut-il faire autrement ?

Merci d'avance.

Eléphant du PHP | 209 Messages

12 sept. 2008, 20:42

Oki, je précise un peu,
j'ai essayé de récupérer le maxi de la pertinence pour l'exprimer en pourcentage...
Et de plus, je voudrais compter le nombre d'enregistrements totaux.
Ce n'est plus la même table que dans le message précédent.
Je fais ça en trois requêtes mais j'aimerais savoir si c'est possible d'optimiser tout ça, en utilisant mieux le GROUP BY par exemple ...

voici mon code :
$reqmax = $sql->query("SELECT MAX(MATCH (message) AGAINST ('$mots' IN BOOLEAN MODE)) as maxi 
								FROM tbf_discussions 
								WHERE MATCH (message) AGAINST ('$mots' IN BOOLEAN MODE)");
list($maxi) = mysql_fetch_row($reqmax);

$reqnb = $sql->query("SELECT COUNT(*) as nb, MATCH (message) AGAINST ('$mots' IN BOOLEAN MODE) as pertinence 
							FROM tbf_discussions 
							WHERE MATCH (message) AGAINST ('$mots' IN BOOLEAN MODE) 
							GROUP BY pertinence
							HAVING pertinence/$maxi > $seuil") or die(mysql_error());
list($nb) = mysql_fetch_row($reqnb);




$req = $sql->query("SELECT SUBSTR(tbf_discussions.message,1,100) as message, MATCH (message) AGAINST ('$mots' IN BOOLEAN MODE) as pertinence
							FROM tbf_discussions 
							WHERE MATCH (message) AGAINST ('$mots' IN BOOLEAN MODE)
							HAVING pertinence/$maxi > $seuil
							ORDER BY pertinence DESC 
							LIMIT $start,$limit") or die(mysql_error());
[/code]

ViPHP
ViPHP | 4039 Messages

13 sept. 2008, 15:49

Salut salut,

Pour ce qui est du paramètrage du moteur fulltext de mysql, ils ont une chouette page:
http://dev.mysql.com/doc/refman/5.0/en/ ... uning.html

En gros, spécifier les stopwords, la taille minimale du mot pour indexer, occurrences maximales d'un mot, etc...

Sinon, question taille, tu devrais pas avoir de problème, tant que tu tient côté RAM. J'utilise tranquillement la recherche sur des bases de + de 100 mo, et y'a pas de souci.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 209 Messages

14 sept. 2008, 14:44

Ok, cependant, je n'ai pas vraiment la main sur le serveur...

Et sinon, pour les requêtes ? On peut pas optimiser un peu plus ?