Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2011, 10h57   #1
Membre émérite
 
Avatar de kmdkaci
 
Inscription : octobre 2007
Messages : 559
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 559
Points : 815
Points : 815
Envoyer un message via Skype™ à kmdkaci
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 :
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 :
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 :
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 :
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
kmdkaci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 12h15   #2
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
salut,

Le fonction 'LIKE' avec un index sur les bonnes colonnes ne peuvent pas t'aider?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 27/05/2011, 12h19   #3
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
ne permet pas l'utilisation des indexes

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 13h01   #4
Membre émérite
 
Avatar de kmdkaci
 
Inscription : octobre 2007
Messages : 559
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 559
Points : 815
Points : 815
Envoyer un message via Skype™ à kmdkaci
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 :
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
kmdkaci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 10h43   #5
Membre émérite
 
Avatar de kmdkaci
 
Inscription : octobre 2007
Messages : 559
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 559
Points : 815
Points : 815
Envoyer un message via Skype™ à kmdkaci
Bonjour,
Est-ce la fonction CONTAINS aussi compliquée que ça ?

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

Merci
kmdkaci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 16h33   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Avec % tu as déjà la réponse non ?
wildcards (% _)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/06/2011, 14h49   #7
Membre émérite
 
Avatar de kmdkaci
 
Inscription : octobre 2007
Messages : 559
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 559
Points : 815
Points : 815
Envoyer un message via Skype™ à kmdkaci
Bonjour
Pour skuatamad:
Les % réduisent beaucoup les performances de la recherche. Et comme les tables sont très volumineuse, cela risque de prendre beaucoup de temps.

Je me demandais si le fait d'utiliser CONTAINS en modifiant certains paramètres de l'Index donnera satisfaction. Mais apparemment ce n'est pas le cas. Il faut absolument utiliser les %

Par conséquent, je mis le statut de la discussion à Résolu
kmdkaci est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h00.


 
 
 
 
Partenaires

Hébergement Web