Dr DLP
31 Décembre 2004, 16:57
31 Décembre 2004, 16:57
Ce n'est pas un mod que je vais développer, c'est juste pour indiquer quelques trucs et faire partager ce que je viens de finir (:)
L'utilisation du FULL TEXT permet (avec mysql seulement, c'est spécifique) de faire des recherches directement dans les champs avec mysql : pas besoin du système phpbb o๠sont stockés tous les mots (ce qui est indispensable pour être compatible avec toutes les bdd).
C'est un peu déroutant à mettre en place, à cause des clés FULLTEXT, alors voici ma table en exemple :
Il faut donc absolument un champ en text (ce qui doit déjà être le cas) qui contient le message et un champ sujet dans la même table (si elle n'existe pas dans FSB, il suffira de dupliquer le titre du topic de rattachement).
Et ensuite créer une clé fulltext sur ces deux champs dont le nom est celui du champ titre.
Ensuite on peut se lancer dans le mysql à proprement parler. Pour ma part j'utilise ce coup-ci une version allégée avec seulement trois requêtes :
1)
Rien de sorcier, ça cherche simplement si un des titres des messages contient la requête : dans ce cas, la relevance est très forte.
2)
La recherche fulltext à proprement parler avec une recherche croisée titre/message. Le tri est effectué par pertinence (score).
J'ai isolé $booleen (de valeur "IN BOOLEAN MODE" pour effectuer des recherches booléennes) car toutes les versions de mysql ne le supporte pas.
Cette requête ca sortir prioritairement les sujets contenant la requête dans le titre et le message, en les classant par nombre d'occurences. C'est aussi la requête qui permet de trouver les messages contenant la requête dans le corps du message.
3)
Requête de secours : la requête "ressemble" au titre du sujet. Ceci est très... autre, avec des résultats très très variables.
Ce sont juste quelques bases : difficile à mettre en oeuvre mais avec de superbes résultats.
Sur un annuaire je fais des recherches croisées titre/description/message, avec 3 clés fulltext, les résultats sont au moins aussi performant que ceux obtenus avec phpbb.
Deux inconvénients : c'est mysql seulement, et sur des recherches comportant beaucoup, beaucoup de messages, c'est lent.
Un peu de doc pour finir : http://dev.mysql.com/doc/mysql/fr/Fulltext_Search.html
Bon courage si quelqu'un essaye
L'utilisation du FULL TEXT permet (avec mysql seulement, c'est spécifique) de faire des recherches directement dans les champs avec mysql : pas besoin du système phpbb o๠sont stockés tous les mots (ce qui est indispensable pour être compatible avec toutes les bdd).
C'est un peu déroutant à mettre en place, à cause des clés FULLTEXT, alors voici ma table en exemple :
Code (Sélectionner le code)
CREATE TABLE base_posts_text ( post_text_id int(8) NOT NULL default '0', post_text_board int(8) NOT NULL default '0', post_text_text text NOT NULL, post_text_subject varchar(255) NOT NULL default '', PRIMARY KEY (post_text_id), KEY post_text_board (post_text_board), FULLTEXT KEY post_text_subject (post_text_subject,post_text_text) ) TYPE=MyISAM;
Il faut donc absolument un champ en text (ce qui doit déjà être le cas) qui contient le message et un champ sujet dans la même table (si elle n'existe pas dans FSB, il suffira de dupliquer le titre du topic de rattachement).
Et ensuite créer une clé fulltext sur ces deux champs dont le nom est celui du champ titre.
Ensuite on peut se lancer dans le mysql à proprement parler. Pour ma part j'utilise ce coup-ci une version allégée avec seulement trois requêtes :
1)
Code (Sélectionner le code)
$sql = mysql_query("SELECT t.topic_id, t.topic_name, pt.post_text_id, pt.post_text_subject, pt.post_text_text
FROM " . POSTS_TEXT_TABLE . " AS pt
LEFT JOIN " . POSTS_TABLE . " AS p ON ( p.post_id = pt.post_text_id )
LEFT JOIN " . TOPICS_TABLE . " AS t ON ( t.topic_id = p.post_topic )
WHERE LOCATE('$search_query', pt.post_text_subject) > 0 $where ") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);Rien de sorcier, ça cherche simplement si un des titres des messages contient la requête : dans ce cas, la relevance est très forte.
2)
Code (Sélectionner le code)
$sql = mysql_query("SELECT t.topic_id, t.topic_name, pt.post_text_id, pt.post_text_subject, pt.post_text_text, MATCH (pt.post_text_subject, pt.post_text_text) AGAINST ('$search_query') AS score
FROM " . POSTS_TEXT_TABLE . " AS pt
LEFT JOIN " . POSTS_TABLE . " AS p ON ( p.post_id = pt.post_text_id )
LEFT JOIN " . TOPICS_TABLE . " AS t ON ( t.topic_id = p.post_topic )
WHERE MATCH (pt.post_text_subject, pt.post_text_text) AGAINST ('$search_query' $booleen) $where ORDER BY score DESC ") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);La recherche fulltext à proprement parler avec une recherche croisée titre/message. Le tri est effectué par pertinence (score).
J'ai isolé $booleen (de valeur "IN BOOLEAN MODE" pour effectuer des recherches booléennes) car toutes les versions de mysql ne le supporte pas.
Cette requête ca sortir prioritairement les sujets contenant la requête dans le titre et le message, en les classant par nombre d'occurences. C'est aussi la requête qui permet de trouver les messages contenant la requête dans le corps du message.
3)
Code (Sélectionner le code)
$sql = mysql_query("SELECT t.topic_id, t.topic_name, pt.post_text_id, pt.post_text_subject, pt.post_text_text, SUBSTRING(SOUNDEX(pt.post_text_subject),1,2) AS cosmos , SUBSTRING(SOUNDEX('$search_query'),1,2) AS spatio
FROM " . POSTS_TEXT_TABLE . " AS pt
LEFT JOIN " . POSTS_TABLE . " AS p ON ( p.post_id = pt.post_text_id )
LEFT JOIN " . TOPICS_TABLE . " AS t ON ( t.topic_id = p.post_topic )
WHERE SUBSTRING(SOUNDEX(pt.post_text_subject),1,2) = SUBSTRING(SOUNDEX('$search_query'),1,2) $where ") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);Requête de secours : la requête "ressemble" au titre du sujet. Ceci est très... autre, avec des résultats très très variables.
Ce sont juste quelques bases : difficile à mettre en oeuvre mais avec de superbes résultats.
Sur un annuaire je fais des recherches croisées titre/description/message, avec 3 clés fulltext, les résultats sont au moins aussi performant que ceux obtenus avec phpbb.
Deux inconvénients : c'est mysql seulement, et sur des recherches comportant beaucoup, beaucoup de messages, c'est lent.
Un peu de doc pour finir : http://dev.mysql.com/doc/mysql/fr/Fulltext_Search.html
Bon courage si quelqu'un essaye


: