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