Recherche MySQL -> FULLTEXT

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Recherche MySQL -> FULLTEXT

Message le Mer Juil 27, 2005 21:40

Hello, re moi ! :wink:

http://dev.mysql.com/doc/mysql/fr/fulltext-search.html

J'ai du mal à imaginer faire une recherche sur une base de données gigantesque avec cette option...
ça pourrait être long, non ?

N'ayant jamais praitquer, j'ai du mal à me faire une idée..
Si quelqu'un d'expérimenté peut me donner son avis, quelques conseils sur la route je l'en remercie !!!

Thierry
Dernière édition par thierry8 le Jeu Juil 28, 2005 7:45, édité 1 fois.

Haq
WRInaute accro
WRInaute accro
 
Messages: 2104
Inscription: Jeu Aoû 29, 2002 21:18

Message le Mer Juil 27, 2005 21:50

Je dirais que l'index double à peu près la taille de ta table, si c'est une table genre forum. Reste à savoir quelle est la taille de ta base et ce que peut supporter ton serveur. Fais de toute façon une sauvegarde de ta table avant d'essayer.

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Mer Juil 27, 2005 21:58

Mais la durée d'une recherche de se type peu s'évaluer à combien de temps ?
(ça me parait long...)

Quel autre moyen d'effectuer une recherche ?
(novice dans ce domaine, si vous pouviez m'indiquer des pistes précises..)

Merci

Haq
WRInaute accro
WRInaute accro
 
Messages: 2104
Inscription: Jeu Aoû 29, 2002 21:18

Message le Mer Juil 27, 2005 22:15

thierry8 a écrit:Mais la durée d'une recherche de se type peu s'évaluer à combien de temps ?
(ça me parait long...)

Quel autre moyen d'effectuer une recherche ?
(novice dans ce domaine, si vous pouviez m'indiquer des pistes précises..)

Merci


La durée dépend de la taille de la table (et surtout des champs de cette table) concernés.

Sinon, il y a les simples requêtes SELECT, avec un "WHERE texte LIKE '%requete%'", mais ça ne triera pas par pertinence et ça limitera aux résultats qui contiennent exactement la requête concernée (équivalent de la recherche entre guillemets sur Google).

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Mer Juil 27, 2005 22:22

ok, et que pense tu même principe avec les requêtes "simple" mais en remplacant LIKE par une expression régulière ?
On pourra obtenir un meilleur résultat...mais le problème restera le même pour la pertinence...!

Personne n'a encore pratiquer le FULLTEXT afin d'effectuer des recherches ?

(pour répondre à ta question la taille de la table, pourrais devenir grosses, genre forum..., mais les champ plutôt simple je pense...un champ FULLTEXT contenant le "contenu"...vois-tu ?)

merci de ta patience... :?
Dernière édition par thierry8 le Jeu Juil 28, 2005 7:43, édité 1 fois.

florianavs18
Nouveau WRInaute
 
Messages: 19
Inscription: Lun Juil 05, 2004 22:22

Message le Mer Juil 27, 2005 23:22

En ce moment, je travaille sur une table qui fait 5.3 Millions d'entrées, 3 Go de data, 1.3 Go d'index et sur un Bi-Xeon 1.7, 1Go de ram j'obtiens de très bon résultats, de l'ordre de 10 à 20 secondes pour une recherche sur 1 ou 2 mots.

Oui je sais, 10 sec c'est énorme pour du web, mais pour mon application, ce n'est que du différé, donc peu important.

Si tu as besoin de plus d'infos, hésite pas.

Florian

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Jeu Juil 28, 2005 7:31

ok super interessant ! Donc tu met tout tes champs en FULLTEXT et ensuite avec la fonction match() tu réalise des recherches ? (ma table devrait être beaucoup moins lourde...)

Est-ce qu'il y à beaucoup de difficulté à mettre cela en place ?

EDIT: (question subsdisiaire)
comment fais tu pour avoir des chiffres précis ?
comment trouve tu l'espace utilisé par la table (normal) et les index ?

Merci beaucoup à toi !

florianavs18
Nouveau WRInaute
 
Messages: 19
Inscription: Lun Juil 05, 2004 22:22

Message le Jeu Juil 28, 2005 12:39

Donc tu met tout tes champs en FULLTEXT et ensuite avec la fonction match() tu réalise des recherches ?

La documentation de mysql spécifie que si tu crée un index FULLTEXT sur (titre, contenu, auteur) par exemple, ta recherche doit absolument porter sur ces trois champs en même temps, pour que l'index FULLTEXT soit utilisé, c'est à dire :

Code: Tout sélectionner
SELECT * FROM articles WHERE MATCH (titre, contenu, auteur) AGAINST ('mot1, mot2');


Si tu fais une requete avec un champs en moins ou un champ en plus, genre :

Code: Tout sélectionner
SELECT * FROM articles WHERE MATCH (titre, contenu) AGAINST ('mot1, mot2');


L'index FULLTEXT sur (titre, contenu, auteur) n'est pas utilisé et donc ta requete prend plus de temps à répondre (j'ai pas fais de tests la dessus :) )


Est-ce qu'il y à beaucoup de difficulté à mettre cela en place ?


Non, c'est une installation classique de Mysql 4.1


comment fais tu pour avoir des chiffres précis ?

Peux tu préciser ?


comment trouve tu l'espace utilisé par la table (normal) et les index ?

phpMyAdmin te donne ces informations dans la page "Structure" de ta table, sinon y'a une fonction SQL mais je ne l'ai pas en tête

Florian

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Jeu Juil 28, 2005 13:12

SUper ! Niquel !
Déjà dans un premier temps un grand merci pour ces informations...

florianavs18 a écrit:La documentation de mysql spécifie que si tu crée un index FULLTEXT sur (titre, contenu, auteur) par exemple, ta recherche doit absolument porter sur ces trois champs en même temps, pour que l'index FULLTEXT soit utilisé, c'est à dire :


C'est à dire que si j'ai une table pour faire une recherche dans cette table de dois lui spécifier tous les champs de type FULLTEXT (pas ceux numérique ou autre...?)

florianavs18 a écrit:Citation:
comment fais tu pour avoir des chiffres précis ?

Peux tu préciser ?


Tu y as répondu juste en dessous... :wink: merci...!

florianavs18
Nouveau WRInaute
 
Messages: 19
Inscription: Lun Juil 05, 2004 22:22

Message le Jeu Juil 28, 2005 13:31

C'est à dire que si j'ai une table pour faire une recherche dans cette table de dois lui spécifier tous les champs de type FULLTEXT (pas ceux numérique ou autre...?)


Et bien tu dois indexer les champs qui te seront utiles pour ta recherche
pour les recherches dans des colonnes de type numérique, tu peux faire un simple index, enfin tout dépend ce que représente cette colonne, par exemple si tu crée une colonne langue et que 1 = Anglais, 2 = Français, 3= Allemand là c'est utlise de faire un index _pour les grosse tables_ par contre si c'est pour dire que machin a 4 messages, l'index ne sera d'aucune utilitée.

Imaginons un contexte de forum, en simplifiant un peu, on dit que la table des messages est : titre, id_auteur, contenu, date_publication, html_actif, bbcode_actif, smilies_actif (je prend vraiment ce qui me tombe sous la main :) ).

- Un INDEX FULLTEXT sera utile sur (titre, contenu)
- html_actif, bbcode_actif, smilies_actif n'a aucun interet à être indexé puisque que ce sont des champs à caractère informatif et on ne recherchera surement jamais avec ces colonnes là en filtre
- par contre dans le cas où on ferait beaucoup de recherche sur les auteurs (je ne sais pas pour quel raisons), la colonne id_auteur (type numérique - identifiant unique interne de l'auteur) doit être indexés en INDEX (pas FULLTEXT).

L'indexation sert essentiellement à gagner du temps pour retrouver tes données, dans le cas de la colonne id_auteur :
- sans index, mySQL parcourait chaque ligne de ta table pour la comparer à la valeur que tu demande
- avec index, mySQL cherche dans son index la valeur que tu demande (qui est forcément indexée) et retourne directement les lignes qui nous interesse. (l'explication n'est pas forcément la plus didactique ni la plus exacte mais elle donne un point de vue général)

Florian

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Jeu Juil 28, 2005 13:39

ok ok...ça commence à rentrer la dedans :roll: !

florianavs18 a écrit:
la colonne id_auteur (type numérique - identifiant unique interne de l'auteur) doit être indexés en INDEX (pas FULLTEXT).


Oui mais un FULLTEXT, c'est bien un champ de type texte qui est indexés ?
(parce que je n'ai jamais vue dans mySQL de type FULLTEXT..[j'utilise EasyPHP]) Et c'est ce que j'ai compris du lien que j'ai indiqué à mon premier post.

EDIT:
Et si je fais une recherche je dois spécifier seulement tous les champs du style FULLTEXT ? (d'après ton exemple [contenu et titre]). Le reste je peux faire une recherche simple comme tu l'as souligné...

florianavs18
Nouveau WRInaute
 
Messages: 19
Inscription: Lun Juil 05, 2004 22:22

Message le Jeu Juil 28, 2005 13:45

Et si je fais une recherche je dois spécifier seulement tous les champs du style FULLTEXT ? (d'après ton exemple [contenu et titre]). Le reste je peux faire une recherche simple comme tu l'as souligné...


Et bien par exemple pour recherche le mot forum dans les messages de l'auteur dont l'identifiant est 5 :

Code: Tout sélectionner
SELECT * FROM messages WHERE MATCH (titre, contenu) AGAINST ('forum') AND id_auteur = 5;



un FULLTEXT, c'est bien un champ de type texte qui est indexés ?


Oui, uniquement des champs de type VARCHAR et TEXT (si je me rappelle bien)

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Jeu Juil 28, 2005 13:54

florianavs18 a écrit:Et bien par exemple pour recherche le mot forum dans les messages de l'auteur dont l'identifiant est 5 :


Ce que je voulais dire c'est par exemple si l'on à pas d'identifiant (un moteur de recherche sur le site, fouillant par exemple dans le forum) on ne connait que les mots clés....Vois-tu ?
Pas besoin de tout renseigner entre autre..?

florianavs18
Nouveau WRInaute
 
Messages: 19
Inscription: Lun Juil 05, 2004 22:22

Message le Jeu Juil 28, 2005 14:03

Pas besoin de tout renseigner entre autre..?


A bah non, tu fais la requete sur les colonne dont tu as besoin

thierry8
WRInaute accro
WRInaute accro
 
Messages: 3251
Inscription: Lun Juil 11, 2005 11:47

Message le Jeu Juil 28, 2005 14:07

En fait j'insiste sur ce point parce que tu avais dis:

florianavs18 a écrit:La documentation de mysql spécifie que si tu crée un index FULLTEXT sur (titre, contenu, auteur) par exemple, ta recherche doit absolument porter sur ces trois champs en même temps, pour que l'index FULLTEXT soit utilisé, c'est à dire :


florianavs18 a écrit:L'index FULLTEXT sur (titre, contenu, auteur) n'est pas utilisé et donc ta requete prend plus de temps à répondre (j'ai pas fais de tests la dessus :) )


Donc finallement je peux faire une recherche uniquement sur les champs dont j'ai besoin, meme si il y a plusieurs FULLTEXT je ne peux en utiliser que un...?

Recherche MySQL -> FULLTEXT

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google TrustRank

  • Logiciel de référencement AgentWebRanking
    AgentWebRanking est un logiciel professionnel qui permet d'analyser le positionnement d'un ou plusieurs sites dans plus de 300 moteurs de recherche dans le monde. Vous pouvez ainsi analyser les performances du référencement pour de nombreux mots-clés.
  • Transformer des citations en liens
    Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités