Recherche dans un forum

50 réponses
AuteurMessage

devtribu |
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 20/10/2006 à 19:32

Bonsoir,

J'ai un forum fait main sur BT qui fonctionne pas trop mal
6000 posts/jour et pas loin de 2 500 000 messages en base

Le probleme c'est (comme souvent) la recherche
Une requete sur un mot clé prend 4 ou 5 secondes et occupe 100% de CPU. Plus on ajoute de mot clé, plus c'est long
C'est pas terrible, d'autant que la recherche est vraiment beaucoup utilisée.

Pour le moment, je fais betement un LIKE
WHERE body LIKE '%motcle%'

Quelles sont les possibilités pour faire une recherche qui ne mette pas a genou mysql ?
Remplacer le LIKE ?
Donner une priorité basse à la requete ?
Utiliser un moteur externe qui crée un index ?


Merci d'avance pour vos idées

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

bhamp0 | Benjamin
Membre

Photo de bhamp0

Inscrit le : 09/05/2005

# Le 20/10/2006 à 19:40

T'as regardé du côté des Regex plutôt ? http://dev.mysql.com/doc/refman/5.0/fr/string-comp...Ouvrir dans une nouvelle fenetre
Je ne garantis rien, je n'ai pas assez de matière pour tester la différence LIKE/REGEXP

Sinon, FULLTEXT aussi ...
http://www.onlamp.com/pub/a/onlamp/2003/06/26/full...Ouvrir dans une nouvelle fenetre

Quand on voit c'qu'on voit, et qu'on entend c'qu'on entend, on a raison d'penser c'qu'on pense !

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 20/10/2006 à 19:57

D'apres mes tests, REGEXP est plutot plus lent que LIKE

Le fulltext est une solution que j'ai envisagée mais qui m'inquiete un peu en raison de la taille de la table des messages du forum
2 500 000 lignes et 600 Mo...

Il faudrait que je fasse le test sur un autre serveur

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 20/10/2006 à 20:01

Je pense que le mieux, c'est le système de punBB et d'autres forums :
- Une table avec tous les mots [clef sur les mots]
- Un table qui lie chaque identifiant de mot à un post [clef sur l'identifiant de mot et index le clef]

La recherche devient alors très rapide. Une fois qu'on demande quelque chose, on recherche les identifiant de mots associé à chaque mot et ont demande les posts qui les possèdent tous. C'est très rapide.
Après, c'est vrai que ça ne permet pas de faire une recherche d'une phrase complète mais tu peux affiner ensuite. Ca ne sera pas pénalisant.

Le gros défaut de cette solution, c'est que ça t'oblige à rentrer tous les messages dans la table et pour les anciens messages, tu vas devoir choisir entre les ignorer ou les ajouter, ça va faire dans les 2,5 * 10^6 * 60 requêtes à effectuer (au pif).

Et d'autre part, ça fait des requêtes SQL un peu plus lourdes (mais c'est souvent la clef des optimisations).

FULLTEXT on en a déja parlé, ça empêche d'utiliser InnoDB et c'est pas toujours très performant. D'autre part, c'est pas forcément gênant mais quand je l'utilisais, ça prenait quand même 50% de l'espace de la table (genre 500Mo pour 1Go de données).

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 20/10/2006 à 20:13

Je fais des tests avec FULLTEXT sur le forum de toutjavascript.com (qui est tres proche mais beaucoup plus petit)

La solution d'une table avec les mots clés, c'est seduisant... Mais qui definit les mots cles ? Faut que ca soit automatique...

L'espace disque n'a pas tellement d'importance si les performances sont satisfaisantes...
Pour le moment, les tables sont en myisam, donc c'est pas genant non plus

Je vous remonterai les resultats

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 20/10/2006 à 21:23

Oui, ça me semblait logique mais ça ne l'est pas forcément. Il faut le faire automatiquement.
Basiquement, pour chaque post, il faut faire du $mots = explode(' ', $message); et après du "INSERT IF NOT EXISTS" pour chaque mot.

C'est un peu contraignant, mais c'est pas la mort non plus.

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 20/10/2006 à 21:29

+1 avec superFc, profite en pour mettre en place du soundex ;)

@+ Jean-Philippe

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 20/10/2006 à 23:12

Oui, c'est vrai, je n'y avais pas pensé. Mais implémenter du soundex ne complique rien et te permet d'avoir une valeur ajoutée. Comme ça, au lieu de copier les mots, tu copies leur valeur soundex, l'intérêt de la table prend d'autant plus de sens (pas de redondance de l'info).

Par contre, même si je ne crois pas que le soundex soit particulièrement adapté à la prononciation anglaise (contrairement au metaphone), je crois qu'il a une analyse "plutôt anglaise".

Pour info, MySQL supporte aussi le soundex nativement, mais ce n'est pas la même implémentation (MySQL c'est l'original, PHP c'est l'améliorée)


Note: This function implements the original Soundex algorithm, not the more popular enhanced version (also described by D. Knuth). The difference is that original version discards vowels first and duplicates second, whereas the enhanced version discards duplicates first and vowels second.


This particular soundex function is one described by Donald Knuth in "The Art Of Computer Programming, vol. 3: Sorting And Searching", Addison-Wesley (1973), pp. 391-392.


Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 21/10/2006 à 03:14

oui, mais en php on trouve des soundex refait pour le francophone ;)

Mais la fonction soundex de mysql, est déjà très bien ! Même pour des sites francophones, c'est pas prévu pour le français, mais ca marche quand même plutôt bien.

Si il y a un souci de performances, il faut mieux faire un soudex avec Mysql qu'un soudex francophone avec Php.

@+ Jean-Philippe

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 21/10/2006 à 09:33

Sur le site principal j'ai deja du soundex pour la recherche de produit ou de marque
C'est pratique quand on tape pas exactement le meme mot. Le script propose une alternative. En général, c'est pas trop mauvais

Pour le forum, je ne veux ni passer des jours à developper un systeme de motcle, ni faire un truc trop gourmand
Mes premiers tests sont plutot bons sur le fulltext
Il va falloir que je coupe le site quelques minutes pour générer l'index. En esperant que ca fasse pas tout sauter !

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

Shain | Yoann
Membre

Photo de Shain

Inscrit le : 10/05/2005

# Le 22/10/2006 à 16:27

Autre voie à explorer pour la pertinence et la rapidité : l'utilisation des API des moteurs de recherche comme Google ou Yahoo.

[ Shain ]
http://www.automobile-propre.comOuvrir dans une nouvelle fenetre - http://fr.chargemap.comOuvrir dans une nouvelle fenetre

bhamp0 | Benjamin
Membre

Photo de bhamp0

Inscrit le : 09/05/2005

# Le 22/10/2006 à 16:34

Je rebondis sur le post de Shain pour dire que si ça intéresse du monde, je me suis plongé là dedans depuis quelques semaines pour faire un méta-moteur de recherche (avec l'API Google Search, l'API MSN Search et le flux Yahoo Search), donc je peux sans problème aider

Quand on voit c'qu'on voit, et qu'on entend c'qu'on entend, on a raison d'penser c'qu'on pense !

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 22/10/2006 à 16:51

bhamp0 > tu as fusionné les résultats de ses 3 apis ? Tu as géré comment le tri entre les résultats ?

@+ Jean-Philippe

jdelire | Lilian
Membre

Photo de jdelire

Inscrit le : 14/05/2005

# Le 22/10/2006 à 16:52

En parlant de ca, je me demandais comment font les sites comme alapage ou amazon pour que la recherche dans leur bases se fasse aussi vite. Parce qu'il doit y avoir des millions d'enregistrements !

Slwo.frOuvrir dans une nouvelle fenetre

bhamp0 | Benjamin
Membre

Photo de bhamp0

Inscrit le : 09/05/2005

# Le 22/10/2006 à 16:58

flush> non justement, c'est ce dont je m'occupe en ce moment actuellement j'affiche les trois, le but étant de regrouper les trois pour faire apparaître des résultats pertinents :p

Quand on voit c'qu'on voit, et qu'on entend c'qu'on entend, on a raison d'penser c'qu'on pense !

Limit | Cyril
Membre

Photo de Limit

Inscrit le : 11/05/2005

# Le 22/10/2006 à 17:30

jdelire a dit :
En parlant de ca, je me demandais comment font les sites comme alapage ou amazon pour que la recherche dans leur bases se fasse aussi vite. Parce qu'il doit y avoir des millions d'enregistrements !

ils utilisent peut-etre une techno google cf http://www.google.fr/enterprise/Ouvrir dans une nouvelle fenetre ou bien ils ont des personnes qui ont planché sur le problème

Forum GratuitOuvrir dans une nouvelle fenetre - Blog gratuitOuvrir dans une nouvelle fenetre

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 22/10/2006 à 17:42

L'api google search a (de memoire) un nombre assez limité de requetes possibles / jour
Mais si tu as une demo et du code source, je suis preneur

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

flush | Jean-Philippe
Modérateur

Photo de flush

Inscrit le : 09/05/2005

# Le 22/10/2006 à 18:04

1000 requètes / jours après il faut payer :'(


bhamp0 > le résultat de ton étude m'intéresse, si cela ne te dérange pas, envoie nous une démo et dit nous un peu comment tu as pu faire pour recouper ses informations, (sur quel critères, quels facteurs etc...)

@+ Jean-Philippe

bhamp0 | Benjamin
Membre

Photo de bhamp0

Inscrit le : 09/05/2005

# Le 22/10/2006 à 18:36

Yahoo et MSN sont mieux de ce niveau, car :
1) ils proposent, de mémoire, 5.000 et 10.000 requêtes par jour
2) ils comptent cela par adresse IP (c'est-à-dire que chaque membre en gros a le droit de faire 5.000 et 10.000 requêtes par jour)

Démo actuelle : http://www.999-search.comOuvrir dans une nouvelle fenetre
C'est *largement* susceptible d'évoluer puisque j'essaie de faire en sorte de recouper les infos pour n'afficher que les résultats pertinents (et non afficher les résultats sur trois colones, une pour Google, une pour MSN, une pour Yahoo, comme c'est le cas actuellement).
De toute façon, je ferai un post une fois que le recoupement d'info sera fait, car là, le moteur sera quasi-finalisé

Quand on voit c'qu'on voit, et qu'on entend c'qu'on entend, on a raison d'penser c'qu'on pense !

superfc | Florent
Membre

Photo de superfc

Inscrit le : 01/07/2006

# Le 22/10/2006 à 18:36

On va me trouver vraiment lourd là. Mais souvent, sur les sites, ce sont les même recherches qui sont faites. Donc en mettant en cache les recherche, on peut déjà économiser quelques requêtes, sur un mois, ça doit sensiblement se sentir.

Par contre, c'est que que pour avoir des résultats pertinents, un moteur propriétaire c'est mieux.

Florent Clairambault - http://florent.clairambault.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 11:24:13 | Généré en 10.2ms | Contacts | Mentions légales |