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

SQL Oracle Discussion :

Problème avec la fonction : CONTAINS


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de kmdkaci
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 560
    Par défaut Problème avec la fonction : CONTAINS
    Bonjour,
    Je travaille sur une application qui permet de rechercher des mots clés dans des textes en utilisant un dictionnaire en entrée. C'est-à-dire :
    J'ai une table DICTIONNAIRE de mots clés que j’appelle un dictionnaire avec un champ MOT_CLE NVARCHAR2(100 CHAR) qui contient ces mot clés.
    Une autre table INCIDENTS avec un champ qui contient du texte DEFAUTS de type VARCHAR2(120 byte).

    Le but du traitement est de remonter toute la liste des mots qui sont dans : A la fois dans le dictionnaire et dans le texte. Pour cela, j'utilise la fonction CONTAINS dans la requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select  * from INCIDENTS where 
    (CONTAINS (DEFAUTS, 'fum' )> 0);
    J'ai mis en dure le mot fum pour faciliter la lecture de la requête. Ce mot parvient de la table DICTIONNAIRE, du champ MOT_CLE.

    Le besoin fonctionnel est : Si je cherche un mot comme fum, il doit me renvoyer tous les textes contenant ce mot, mais aussi tous les textes contenant les mots comme fumee. Mais le résultat n'est pas celui attendu. car la recherche effectuée s'est basé uniquement sur le mot recherché avec exactitude de 100%. Concrètement ça donne ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select  * from INCIDENTS where 
    (CONTAINS (DEFAUTS, 'fum' )> 0);
     
    1 - fum est un mot clé de 3 lettre
    2 - je ne fum pas pour ne pas faire du sport
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select  * from INCIDENTS where 
    (CONTAINS (DEFAUTS, 'fumee' )> 0);
     
    3 - Il n y a pas de fumee sans feu
    4 - On voit de la fumee, on a enfin un pape
    Je m'attendais à ce que : Quand je cherche le mot fum, j’obtiens aussi les lignes 3 & 4. Pourquoi je n'obtiens que les ligne 1 & 2

    Est ce qu'il y a un paramètre à modifier lors de la création de l'index ou de la table pour permettre la recherche avec inclusion?

    Pour info, la liste des mots est importante, et la table INCIDENT est d'une grande volumétrie. Pour cela on utilise un index texte sur le champ DEFAULTS.
    L'utilisation de la fonction LIKE ou INSTR n'arrange pas les choses, les traitement sont très longs.

    Sachant que j'ai ceci lors de la création de l'index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    begin
      ctx_ddl.create_preference('"PRE_INCIDENTS _01_WDL"','BASIC_WORDLIST');
      ctx_ddl.set_attribute('"PRE_INCIDENTS _01_WDL"','STEMMER','AUTO');
      ctx_ddl.set_attribute('"PRE_INCIDENTS _01_WDL"','FUZZY_MATCH','AUTO');
      ctx_ddl.set_attribute('"PRE_INCIDENTS _01_WDL"','SUBSTRING_INDEX','NO');
      ctx_ddl.set_attribute('"PRE_INCIDENTS _01_WDL"','PREFIX_INDEX','YES');
      ctx_ddl.set_attribute('"PRE_INCIDENTS _01_WDL"','PREFIX_MIN_LENGTH','4');
      ctx_ddl.set_attribute('"PRE_INCIDENTS _01_WDL"','PREFIX_MAX_LENGTH','8');
    end;
    J'ai modifié la valeur de SUBSTRING_INDEX à YES, mais j'ai toujours le même résultat.

    Quelqu’un a une idée sur ce sujet ?

    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    salut,

    Le fonction 'LIKE' avec un index sur les bonnes colonnes ne peuvent pas t'aider?

  3. #3
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    ne permet pas l'utilisation des indexes

    Bon courage

  4. #4
    Membre émérite
    Avatar de kmdkaci
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 560
    Par défaut
    Merci pour vos réponses.
    Malheureusement le LIKE ne règle pas le problème, comme l'index n'est pas pris en compte avec cette fonction, les temps de réponse sont conséquents.

    Je me pose la question s'il faut utiliser un paramètre particulier dans la création de l'index afin de permettre l'utilisation de la fonction CONTAINS.

    En attendant on peut utiliser le %fum% à la place de fum, donc on obtient la requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT  * FROM INCIDENTS WHERE 
    (CONTAINS (DEFAUTS, '%fum%' )> 0);
    Existe-il une modification à effectuer dans les paramètres pour éviter d’utiliser cette notion ? Sans %

    Merci

  5. #5
    Membre émérite
    Avatar de kmdkaci
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 560
    Par défaut
    Bonjour,
    Est-ce la fonction CONTAINS aussi compliquée que ça ?

    Quelqu’un a déjà utilisé cette fonction ?

    Merci

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Avec % tu as déjà la réponse non ?
    wildcards (% _)

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

Discussions similaires

  1. problème avec la fonction contains()
    Par vhenin dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 31/08/2010, 16h26
  2. [XSLT] Problème avec la fonction contains
    Par yozart dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 24/11/2008, 14h57
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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