IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Erreur : Recherche FULL TEXT


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut Erreur : Recherche FULL TEXT
    Bonjour,

    Je souhaiterai faire une recherche de mot clés dans mon champs "Type" afin d'afficher dans une autre colonne "Type_Desc" le mot VOITURE si un des termes est trouvés. Je "complique" ensuite la requête si le mot est trouvé en vérifiant qu'il y a bien tel mot ou tel mot dans le champs Reference

    Je pensais faire la requête suivante mais je m'apercois qu'une erreur est générée du fait de l'utilisation de CONTAINS :

    La requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UPDATE TEMP SET Type_Desc =
    (CASE 
    	WHEN (	((Type)='VT' AND CONTAINS (Reference, '%CLIO% OR %mégane% OR %Ferrari% OR %golf% OR %Golf% OR %GOLF%'))
    		OR	((Type)='VHQ' AND CONTAINS (Reference, '%CLIO% OR %mégane% OR %Ferrari% OR %golf% OR %Golf% OR %GOLF%'))
    		OR	((Type)='VEHICULE' AND CONTAINS (Reference, '%CLIO% OR %mégane% OR %Ferrari% OR %golf% OR %Golf% OR %GOLF%'))
    		OR  (Type)='A'  
    		OR	(Type)='4' ) 
    	THEN 'VOITURE'
    	ELSE 'MOTO'
    END
    )
    J'ai le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Impossible d'utiliser le prédicat CONTAINS ou FREETEXT sur table ou vue indexée 'TEMP', car il n'y a pas d'index de texte intégral.
    J'ai du coup chercher un peu et je suis tombé la dessus pour SQL Server 2005: http://labs.bewise.fr/Article/Mise-e...L-Server-2005/

    Seulement je me demande si c'est bien cette solution que je dois adopter et adapter pour ma base SQL Server 2008 ?
    Ou il y a t-il d'autre solution ? Je pourrais utiliser le LIKE dans ma requête mais je suis obligé de préciser à chaque fois la colonne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Reference) LIKE %CLIO% OR (Reference) LIKE %Clio%  OR (Reference) LIKE...
    Voila, merci de votre aide

    Cordialement bibouex

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Le message est explicite : il faut indexer ton champ reference avec un index fulltext.

    Vu le nom de ta table, ça ne me semble pas une bonne idée : l'indexation fulltext est :
    1/ lente
    2/ consommatrice
    3/ non fiable : si tu interroge l'index alors qu'il n'a pas fini sa mise à jour, tu n'auras pas de résultat OU des résultats qui ne contiennent pas ce que tu cherches !

    Donc à réserver pour des tables de contenu qui ne changent pas énormément (référentiel produit, etc.)

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Il reste donc le like, sâchant que c'est :
    - lent
    - case sensitive
    - que ça suit pas les index
    - qu'à mon avis, tu devrais de débrouiller pour savoir si c'est une voiture ou une moto AVANT d'allimenter la table

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut
    Avant d'alimenter ma table ? C'est ce que je veux faire en travaillant sur la table TEMP avant le chargement de mes données dans mon Datawarehouse...

    Bon j'ai pas expliquer tout mon projet mais j'ai fait un petit post juste avant sur le forum justement pour comprendre la manière d'agir au niveau de l'ETL...

    http://www.developpez.net/forums/d11...uestion-t-etl/

    Ma table TEMP n'est autre qu'une table de préparation de mes données donc en gros je voulais rajouter un champs dans TEMP pour faire le tri afin que deriere dans mon DW je puisse faire la jointure sur ma dimension TYPE_VEHICULE, dans laquelle j'ai VOITURE ou MOTO

    Enfin c'est un exemple que j'ai donnée, c'est pas les vrai nom de table et de champs car sinon ca devenait trop compliqué...

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Il reste donc le like, sâchant que c'est :
    - case sensitive
    - que ça suit pas les index
    depuis quand le like ou le = sont case sensitive? cela dépend de la COLLATION!
    Le like peut très bien tirer partie d'un index....
    lente
    La recherche FULLTEXT est tout sauf lente!!!

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 60
    Par défaut
    Citation Envoyé par iberserk Voir le message
    La recherche FULLTEXT est tout sauf lente!!!
    Si je peux me permettre je pense que je vais suivre tes conseils (de par ton expérience et les nombreuses participation sur ce forum qui en on aidé plus d'un )
    De toute façon je me suis "planté" dans l'utilisation de SSIS puisque je l'utilise principalement comme un ordonnanceur et non pas en vrai Data Flow...

    J'ai juste utilisé la tache de flux de données afin d'extraire mon fichier source puis je l'envoie dans une table TEMP. Sur cette dernière j'ai crée toute une succession de tâches de requêtes SQL qui nettoient, modifient et ajoutent des données avant de tous dispatcher dans ma table des faits et mes dimensions...
    Donc ne comprenant pas très bien comment marche chaque module SSIS et comprenant de mieux en mieux le langage SQL je crois que le plus simple est d'utiliser l'indexation sur mon champ "Reference", enfin je crois ?

    Si vous avez d'autres conseils je suis preneur

  7. #7
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Attention, lis ma réponse, je ne fais que répondre à StringBuilder pour le coups...

    Si c'est une table de "travail" utilisé comme table intermédiaire dans ton lot SSIS l'indexation FULLTEXT n'est peu être pas la meilleur solution du fait de l'indexation asynchrone...

    La colonne indexée est elle grosse?Combien de lignes as tu? le mieux est que tu test...

    Pour ma part l'indexation de plusieurs milliers de ligne est instantannée...

  8. #8
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iberserk Voir le message
    depuis quand le like ou le = sont case sensitive? cela dépend de la COLLATION!
    Oui, sauf que généralement, on met une collation CS, car on a plus souvent besoin d'être CS que CI.

    Citation Envoyé par iberserk Voir le message
    Le like peut très bien tirer partie d'un index....
    Oui, quand on fait un like 'toto%', ou éventuellement un like '%toto', mais un like '%toto%', je ne suis pas certain que l'utilisation d'un index soit possible/pertinente.

    Citation Envoyé par iberserk Voir le message
    La recherche FULLTEXT est tout sauf lente!!!
    Je ne parlais pas de la recherche, mais de l'indexation.

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Attention aux temps de réponse sur l'environnement de DEV !

    L'indexation fulltext est asynchrone.

    Cela veut dire que rien ne t'empêche d'interroger l'index alors qu'il n'est pas reconstruit.

    Et dans ce cas, c'est vite catastrophique.

    Sur les grosses bases de production, on a rarement des index full text qui se construisent tous seuls, on attend généralement un moment calme de la journée pour le faire... Et si la base est fortement sollicité, elle le fera pour tout de toute façon, même si tu le force en automatique !

    Donc inserrer 130 000 lignes d'un coup et faire des select dessus dans la milli-seconde qui suit, c'est suicidaire en fulltext.

    Il vaut mieux dans ton cas sacrifier un peu de CPU et faire un LIKE, qui donnera un résultat exact à tout les coups.

    J'insiste sur le fait que même si ta requête renvoie quelquechose, ce qu'elle renverra ne sera peut-être pas bon !

    J'ai anciennement fait un site web qui utilisait fulltext pour faire des recherches dans des articles, et c'était assez marrant de voir que parfois, à 5 minutes d'interval, j'avais pas du tout les mêmes résultat... et parfois n'importe quoi car un article avait été modifié et interrogé avant la reconstrution de l'index, et on avait donc un article qui s'affichait dans la recherche, alors qu'il ne contenait pas du tout les mots recherchés !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche Full Text
    Par fadeninev dans le forum SQLite
    Réponses: 1
    Dernier message: 20/10/2006, 10h21
  2. [recherche FULL TEXT ]
    Par viny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/09/2006, 17h08
  3. [MySQL] Recherche FULL TEXT IN BOOLEAN MODE et les Quotes
    Par GarGamel55 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/01/2006, 20h01
  4. [Info]moteur de recherche full text en environnement j2ee
    Par ddams dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/11/2004, 19h39
  5. Recherche FULL Text existe que dans MySql ?
    Par seb.49 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/06/2004, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo