PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 18/11/2008 11:18:26

GLAURENT
Membre

Recheche FULL TEXT avec PostgreSQL

Bonjour,

J'aimerai avoir des informations au sujet de la recherche FULL TEXT dans Postgresql.

Par exemple, lorsque je fait une recherche dans une table pour retrouver un texte qui contient la ville de Nantes, si je fait une recherche avec 'nantes' ou 'nant' cela fonctionne, par contre si je fait une recherche avec 'nan' ou 'ant' cela ne fonctionne pas !
A priori le lexeme de Nantes serait 'nant' et pas 'nan' ou 'ant' (voir la commande SELECT * FROM ts_debug('french', 'nantes')!

Je ne sait pas si ce fonctionnement est normal, et si il existe un moyen pour contourner ce problème ?

Merci pour votre aide .

----------------------------------------------------------------------------------------------------------------------------
La version de Postgres :
 
   Postgresql 8.3.4
----------------------------------------------------------------------------------------------------------------------------
L'ordre de création de la table :

  CREATE DATABASE texto with encoding = 'UTF8';

   CREATE TABLE ville (
     localité    text,
     description text,
     tsv         tsvector
  );
----------------------------------------------------------------------------------------------------------------------------
L'ordre de création du trigger :

   CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
   ON ville FOR EACH ROW EXECUTE PROCEDURE
   tsvector_update_trigger(tsv, 'pg_catalog.french', localité, description);
----------------------------------------------------------------------------------------------------------------------------
L'insertion de données de tests dans la table :

   INSERT INTO ville VALUES('nantes', 'la ville de nantes est en bretagne');
   INSERT INTO ville VALUES('nan', 'nan est un mot');
   INSERT INTO ville VALUES('ant', 'ant est un mot');
   INSERT INTO ville VALUES('Mantes', 'la ville de mantes est dans les yvelines en IDF');
----------------------------------------------------------------------------------------------------------------------------
Les différentes requêtes de tests :

1 requête :
SELECT * FROM ville where tsv @@ to_tsquery('nantes');

localité |       description                          |            tsv             
----------+--------------------------------------------+----------------------------
nantes   | la ville de nantes est presque en bretagne | 'nant':1,5 'vill':3 'bretagn':9

2 requête :
SELECT * FROM ville where tsv @@ to_tsquery('nant');

localité |       description                          |            tsv             
----------+--------------------------------------------+----------------------------
nantes   | la ville de nantes est presque en bretagne | 'nant':1,5 'vill':3 'bretagn':9

3 requête :
SELECT * FROM ville where tsv @@ to_tsquery('nan');

localité |    description       |       tsv             
----------+----------------------+----------------------------
nan      |   nan est un mot     | 'mot':5 'nan':1,2

4 requête :
SELECT * FROM ville where tsv @@ to_tsquery('ant');

localité |    description       |       tsv             
----------+----------------------+----------------------------
ant      |   ant est un mot     | 'ant':1,2 'mot':5

Les deux premières requêtes remontent correctement la ville de Nantes, par contres les deux autres ne remontent pas la vile de Nantes !

Avec les fonctions ts_debut et ts_lexize on visualise le lexeme qui est 'nant':

SELECT * FROM ts_debug('french', 'nantes');

   alias   |   description   | token |  dictionaries |  dictionary  | lexemes
-----------+-----------------+-------+---------------+--------------+---------
asciiword | Word, all ASCII | nantes| {french_stem} | french_stem | {nant}

SELECT ts_lexize('french_stem','nantes');

ts_lexize
---------
{nant}
(1 row)

Gérald LAURENT

Hors ligne

#2 18/11/2008 19:26:06

gleu
Administrateur

Re : Recheche FULL TEXT avec PostgreSQL

C'est un fonctionnement normal. La recherche plein texte est une recherche basée sur la langue. Avant d'effectuer la recherche, le moteur récupère les racines des mots et la recherche ne se fait que sur la racine. Chercher ant pour récupérer Nantes ne peut pas fonctionner car les racines des deux mots sont différentes.


Guillaume.

Hors ligne

#3 21/11/2008 10:35:53

GLAURENT
Membre

Re : Recheche FULL TEXT avec PostgreSQL

Merci, pour votre aide.

En fait j'avais mis 2 exemples "nan" et "ant", et effectivement ant n'est pas dans la racine, mais par contre "nan" y est, mais avec une longueur de 3 caractères.
Visiblement le lexeme de Nantes étant "nant" et pas "nan", est-il possible de diminuer la longueur de ce lexeme ? Ou bien est-ce impossible car c'est peut être en dur dans le dictionnaire ?
Si vous avez d'autres informations à ce sujet .
Merci encore.

Hors ligne

#4 21/11/2008 10:53:33

jpargudo
Administrateur

Re : Recheche FULL TEXT avec PostgreSQL

Bonjour,

Tu peux regarder aussi le projet de Dimitri Fontaine, "prefix", cela peut-être une bonne alternative pour nan -> nantes:

http://prefix.projects.postgresql.org/ 
http://cvs.pgfoundry.org/cgi-bin/cvsweb … ix/prefix/ 
http://pgsql.tapoueh.org/site/html/prefix/index.html 
http://pgsql.tapoueh.org/site/html/news … prefix.pdf

Bonne journée,

Hors ligne

#5 21/11/2008 19:12:04

gleu
Administrateur

Re : Recheche FULL TEXT avec PostgreSQL

C'est en dur dans le dictionnaire. Le seul moyen serait d'ajouter son propre dictionnaire ou d'ajouter un dictionnaire des synonymes en indiquant que nan est un synonyme de Nantes. Ce n'est pas difficile à faire mais ça parait un peu dangereux. Une personne qui chercherait nan pour, je ne sais pas, nanti par exemple, se trouverait avec des liens sur Nantes uniquement.


Guillaume.

Hors ligne

#6 21/11/2008 19:14:41

gleu
Administrateur

Re : Recheche FULL TEXT avec PostgreSQL

J'en profite pour me faire de la pub smile

Le numéro 111 du GNU/Linux Magazine France comprendra un article de 8 pages sur la recherche plein texte. Il y a une explication sur l'ajout de dictionnaire (à mon souvenir).


Guillaume.

Hors ligne

#7 24/11/2008 11:13:05

GLAURENT
Membre

Re : Recheche FULL TEXT avec PostgreSQL

Merci pour l'information, cela m'intéresse de savoir que comportement est normal.
Pour la partie synonymes, j'ai déjà fait l'essai, mais cela n'est pas très satisfaisant,
car cela oblige à mettre toutes les villes dans le dictionnaire de synomymes
(Nantes n'était qu'un exemple) et ensuite j'ai peur effectivement des effets de bords !
Voici la manip ou cas ou cela intéresserait quelqu'un...je me suis basé sur la documentation en
français (merci au traducteur), chapitre 12.6.3 Dictionnaire des synonymes http://docs.postgresql.fr/8.3/textsearc … aries.html

1 export SHAREDIR=/post834/pgsql/share
2 cd $SHAREDIR/tsearch_data
3 vi my_mysynonym.syn
   nantes nan
4 CREATE TEXT SEARCH DICTIONARY my_synonym(
      TEMPLATE = synonym,
      SYNONYMS = my_synonyms);
5 ALTER TEXT SEARCH CONFIGURATION french ALTER MAPPING
  FOR asciiword WITH my_synonym, french_stem;

6 Essai avec ts_debug :

SELECT * FROM ts_debug('french', 'nantes');

   alias   |   description   | token |  dictionaries |  dictionary  | lexemes
-----------+-----------------+-------+---------------+--------------+---------
asciiword | Word, all ASCII | nantes| {my_synonym,french_stem} | my_synonym | {nan}


7 essai avec to_tsquery :

SELECT * FROM ville where tsv @@ to_tsquery('nan');

localité |       description                          |            tsv             
----------+--------------------------------------------+----------------------------
nantes   | la ville de nantes est presque en bretagne | 'nan':1,5 'vill':3 'bretagn':9

Et encore merci pour votre aide !
Cela sera intéressant d'avoir un article sur la "recherche full text" car cela n'est pas très simple au départ.
Re-pub !

Hors ligne

Pied de page des forums