Oracle 11.2.0.2 offre une nouvelle fonctionnalité qui permet de rechercher des bases de données de noms propres. Après-tout, c’est un besoin qu’on retrouve dans beaucoup d’applications et, jusqu’alors, il fallait trouver un moteur spécifique en dehors de la base de données ou obliger les utilisateurs à épeler les noms correctement ; peut-être avez vous, un jour, essayé soundex()
. Si c’est le cas avez sûrement dû faire autrement…
Cet article ne fait rien d’autre que de reprendre le premier exemple du document « Oracle® Text Application Developer’s Guide 11g Release 2 (11.2) -> Using Oracle Text Name Search » et de le tester avec mon propre nom. Le niveau zéro du test mais une (bonne) surprise malgré tout comme vous allez le découvrir.
Créer une table et un Index
Le premier exemple de la documentation utilise une table qui mélange noms prénoms et créé un index avec les bons paramètres. J’ai très légèrement modifié le script, surtout pour y inclure mon propre nom ; Voici le résultat que vous pouvez tout simplement lancer dans le schéma SYS
ou SYSTEM
:
create table people (
full_name varchar2(2000));
insert into people values
('Grégory Guillou');
select * from people;
FULL_NAME
---------------
Grégory Guillou
begin
ctx_ddl.create_preference('name_ds', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('name_ds', 'COLUMNS', 'full_name');
end;
/
begin
ctx_ddl.create_section_group('name_sg', 'BASIC_SECTION_GROUP');
ctx_ddl.add_ndata_section('name_sg', 'full_name', 'full_name');
end;
/
begin
ctx_ddl.create_preference('name_wl', 'BASIC_WORDLIST');
ctx_ddl.set_attribute('name_wl', 'NDATA_ALTERNATE_SPELLING', 'FALSE');
ctx_ddl.set_attribute('name_wl', 'NDATA_BASE_LETTER', 'TRUE');
ctx_ddl.set_attribute('name_wl', 'NDATA_JOIN_PARTICLES',
'le:de:di:la:da:el:del:qi:abd:los:la:dos:do:an:li:yi:yu:van:jon:un:sai:ben:al');
end;
/
create index people_idx on people(full_name) indextype is ctxsys.context
parameters ('datastore name_ds section group name_sg wordlist name_wl');
Quelques tests
Pour constater le résultat, lancez quelques requêtes :
var name varchar2(40);
exec :name := 'Grégory Guillou'
col full_name format a15
set lines 80
col score format 999
select full_name, score(1) score
from people
where contains(full_name, 'ndata( full_name, '||:name||') ',1)>0
order by score(1) desc
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 100
exec :name := 'Guillou Grégory'
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 100
exec :name := 'Grégorie'
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 74
exec :name := 'Guillou'
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 100
exec :name := 'Guyou'
/
no rows selected
exec :name := 'Guilloux'
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 91
exec :name := 'Le Guillou';
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 69
exec :name := 'GREGORY'
/
FULL_NAME SCORE
--------------- -----
Grégory Guillou 90
Malheureusement, le système ne reconnait pas GUYOU
ce qui phonétiquement est très proche de GUILLOU
et peut donc être confondu. Cela étant, tous les autres tests fonctionnent très bien et j’ai l’impression que ça mérite une évaluation plus approfondie.
Supprimer la table
Pour en finir avec ce test, supprimer, table, index et configuration Oracle Text
drop index people_idx;
exec ctx_ddl.drop_preference('name_wl');
exec ctx_ddl.drop_section_group('name_sg');
exec ctx_ddl.drop_preference('name_ds')
drop table people purge;
Conclusion
Cette fonctionnalité est d’autant plus intéressante à explorer que, (1) le problème qu’il adresse est assez commun et que (2) la fonctionnalité fait partie d’Oracle Text et donc dans les versions SE1, SE et EE. Le premier qui utilise cette fonctionnalité en prod, laisse un commentaire ;-).
4 réflexions sur “Oracle Text Name Search : Recherches de noms propres avec Oracle”
Bonjour,
Merci pour la réponse.
En fait je suis en plein dans Oracle Text(sur une 10g) et j’essaie d’être attentif aux « features » du produit. Le produit et la documentation est tellement énorme que je n’en suis pas encore venue à bout 🙂
bonne journée
Bonjour,
Ca mérite un peu de pratique pour déterminer ce qu’on peut vraiment en tirer et si c’est vraiment efficace. Cet article ne fait que quelques tests rudimentaires ; par exemple, des solutions basées sur la phonétiques feront un rating très proche de « guyou » et « guillou ».
Pour répondre spécifiquement à ta question, les sections de la documentation à explorer sont:
NDATA, ndata_base_letter, ndata_alternate_spelling, ndata_thesaurus, ndata_join_particles et ctx_ddl.ADD_NDATA_SECTION. Toutes ses fonctions et attributs sont nouveaux avec 11.2.0.2 et permettent sur des éléments identifiés (dites NDATA) d’indexer des structures de types noms et de ramener de résultats qualifiés avec un algorithme de score. Cet algorithme prend en compte des particules mais aussi des équivalences entre les langues, des diminutifs connus (e.g. Greg pour Gregory) en plus des attributs classiques Text qu’on peut également utiliser pour certain.
Evidemment encore faut-il avoir un besoin…
Bonjour,
Quelle est la valeur ajoutée de cette fonction? Permet elle de gérer les « particules » pour les différents pays?
Merci pour votre eclaircissement
Cdt
Ce commentaire a été supprimé par l’auteur.
Les commentaires sont fermés.