200 likes | 285 Views
Explore the Tsearch2 tool for full-text search in PostgreSQL, indexing lexical units, linguistic morphology, dictionary integration, and query optimization. Learn to install, modify schema, and utilize search functions effectively.
E N D
Fonctionnalités et limites d’outils d’indexation et de recherche "full text" Tsearch2 (PostgreSQL) Réseau BD 11/12/08
C’est quoi Tsearch2 ? Réseau BD 11/12/08
C’est quoi tsearch2 • Un module de recherche plein texte • Spécifique du SGBD PostgreSQL • en module contrib à partir 7.4 http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intro.html • intégré au moteur en 8.3, avec une meilleure gestion, de nouveaux langages et de nouveaux dictionnaires http://docs.postgresql.fr/8.3/pg83.pdf • Utilisé généralement sur des champs texte en langage naturel (ex: titres de films) Réseau BD 11/12/08
Pourquoi tsearch2 ? • Les recherches de texte du type LIKE, ILIKE, ~ et ~* ne suffisent pas pour des recherches en langue naturelle. • Avec les outils tsearch2, on peut transformer une phrase en un ensemble d’unités lexicales qui sont appelées lexèmes. • En linguistique : morphème n.m., unité minimale de signification: Dans le mot " mangiez ", " -iez " est un morphème grammatical (= 2 e personne du pluriel), et " mang- " est un morphème lexical (= lexème). • On peut les stocker, les indexer et faire des recherches à partir d’eux. Réseau BD 11/12/08
Description tsearch2 • Tsearch2 propose plusieurs dictionnaires (anglais, espagnol, français, ..) • Un certain nombre de mots comme the, of, etc.. ne seront pas indexés. Une liste par défaut existe. Elle peut-être modifiée. • On peut stocker et indexer les lexèmes de plusieurs champs dans un seul champ.A partir du lexème, on recherchera donc les enregistrements dont le champ A ou le champ B ou le champ C .. • On peut utiliser les opérateurs booléens, pour faire une recherche sur les lexèmes. (and , or , not) Réseau BD 11/12/08
Tsearch2 utilisé à l’URGI Réseau BD 11/12/08
Tsearch2 à l’URGI • Utilisé en 2006 • Avec la version 7.4 de PostgreSQL • Pour améliorer les performances (like ‘%nom%’ n’utilise pas d’index) • Sur des données d’ontologies (GO) • Avec un dictionnaire en anglais • Abandonné car cela ne correspondait pas à nos besoins . Réseau BD 11/12/08
Exemple • Table cvterm: • champ name (character) • champ definition (text) • name: • phosphocreatine catabolism • Definition: • The breakdown into simpler components of phosphocreatine, a phosphagen of creatine which is synthesized and broken down by creatine phosphokinase. • Recherche dans champ définition Réseau BD 11/12/08
Exemple: que fait tsearch2 ? • Definition: • The breakdown into simplercomponents of phosphocreatine, a phosphagen of creatine which is synthesized and broken down by creatine phosphokinase. • Nouvelle colonne idxdefinition • 'broken':16 'compon':5 'creatin':11,19 'simpler':4 'synthes':14 'breakdown':2 'phosphagen':9 'phosphokinas':20 'phosphocreatin':7 Réseau BD 11/12/08
Utilisation tsearch2 • Installer un module (tables, fonctions et types) dans la base qui nous intéresse. • Donner les permissions sur les nouvelles tables du superutilisateur. • Modifier le schéma de la base de données: Ajouter de nouvelles colonnes dans les tables contenant les champs concernés. • Remplir ces nouvelles colonnes a l’aide des fonctions tsearch2 • Développer des requêtes pour interroger la base avec le langage tsearch2 (fonctions). Réseau BD 11/12/08
Installation module • Le superuser installe dans la database $PGHOME/share/contrib/tsearch2.sql • Donne les permissions sur les tables tsearch2 à l’utilisateur propriétaire de la database • pg_ts_cfg • pg_ts_cfgmap • pg_ts_dict • pg_ts_parser Réseau BD 11/12/08
Modifier le schema • ALTER TABLE cvterm ADD COLUMN idxdefinition tsvector; • UPDATE cvterm SET idxdefinition=to_tsvector('default',definition); • VACUUM FULL ANALYZE; • CREATE INDEX idxdefinition_idx ON cvterm USING gist(idxdefinition); • VACUUM FULL ANALYZE; • CREATE TRIGGER tsvectorupdatecvterm BEFORE UPDATE OR INSERT ON cvterm FOR EACH ROW EXECUTE PROCEDURE tsearch2(idxdefinition, definition); Réseau BD 11/12/08
Types, fonctions et opérateurs • select * from cvterm where idxdefinition @@ to_tsquery('default',‘kinase'); • Select to_tsvector('Presentation of Postgres') as lexemes; • lexemes • ------------------------ • 'postgr':3 'present':1 Réseau BD 11/12/08
Requêtes • select count(*) from cvterm where idxdefinition @@ to_tsquery('default',‘similarity'); 114 • Filter: (idxdefinition @@ '''similar'''::tsquery) • select count(*) from cvterm where idxdefinition @@ to_tsquery('default',‘similar'); 114 • Filter: (idxdefinition @@ '''similar'''::tsquery) • select count(*) from cvterm where definition like '%similar%'; 114 • Filter: (definition ~~ '%similar%'::text) • select count(*) from cvterm where definition like ; '%similarity%'; 7 • Filter: (definition ~~ '%similarity%'::text) Réseau BD 11/12/08
Requêtes • select count(*) from cvterm where idxdefinition @@ 'kinas'::tsquery; 161 • Filter: (idxdefinition @@ '''kinas'''::tsquery) • select count(*) from cvterm where idxdefinition @@ to_tsquery('default','kinase'); 161 • Filter: (idxdefinition @@ '''kinas'''::tsquery) • select count(*) from cvterm where definition like '%kinase%'; 170 • Filter: (definition ~~ '%kinase%'::text) • select count(*) from cvterm where idxdefinition @@ 'phosphokinas'::tsquery; 3 • Filter: (idxdefinition @@ '''phosphokinas'''::tsquery) Réseau BD 11/12/08
Performances • select * from cvterm where definition like '%kinase%'; • Time: 81.661 ms 170 rows sur 21829 • select * from cvterm where idxdefinition @@ 'kinas'::tsquery; • Time: 17.919 ms 161 rows sur 21829 • Table testée en prod: featureprop , 2932584 lignes dont 1833285 indexées par tsearch2 (C. Pommier) • 8006,802 ms => 415,942 ms • Avec jointure featureprop join feature using (feature_id) • 9840,845 ms => 435,731 ms Réseau BD 11/12/08
Intérêt tsearch2 • Augmentation des performances • Insuffisance des expressions rationnelles car • elles ne peuvent pasgérer facilement les mots dérivés, par exemple satisfait et satisfaire. • La recherche sur satisfaire ne ramène pas satisfait • Fournir un classement (score) des résultats de la recherche • Etablir une correspondance entre différentes variations d'un mot et une forme canonique • Faire une liste de synonymes Réseau BD 11/12/08
Inconvénients • Modification du schéma • Requêtes non “SQL ANSI compliant“ • Difficultés si on veut générer les requêtes à partir d’outils du type hibernate. • SGBD spécifique Réseau BD 11/12/08
Questions ? Réseau BD 11/12/08
Architecture n-tiers et URGI Outils URGI Struts Spring AndroMDA Hibernate search Hibernate Lucene Diag. UML Oracle Magic Draw PostgreSQL Réseau BD 11/12/08