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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select * from INCIDENTS where (CONTAINS (DEFAUTS, 'fum' )> 0);
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 sportJe 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
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
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 :
J'ai modifié la valeur de SUBSTRING_INDEX à YES, mais j'ai toujours le même résultat.
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;
Quelqu’un a une idée sur ce sujet ?
Merci d'avance
Partager