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 26/05/2016 11:20:04

thomasp
Membre

Recherche fulltext : quel lexeme a été trouvé?

Bonjour à tous,
Je fais de la recherche full texte sur des chaînes de plusieurs mots, j'aimerais savoir lequel des lexèmes que je recherche a matché avec le résultat qui m'est renvoyé. Un exemple si ce n'est pas clair:
J'ai une table avec un champs tsvector, dans lequel je recherche la chaîne "restaurant chinois":

  ma_table
|ma_colonne TEXT | mon_tsvector TSVECTOR|
-----------------------------------------
|restauration    | restaur              |
-----------------------------------------

select ma_colonne
from ma_table
where mon_tsvector @@ to_tsquery('restaurant|chinois');

--résultats:
ma_colonne
---------------
restauration

J'ai bien trouvé grâce à la recherche full text la ligne qui contenait "restauration", mais comment savoir si "restauration" a matché avec "restaurant" ou "chinois"?
J'ai cherché un peu du côté de ts_headline, mais ça ne fait pas tout à fait ce que je veux, et ça n'utilise pas le tsvector donc c'est beaucoup plus long!

Merci!

Hors ligne

#2 27/05/2016 09:22:32

gleu
Administrateur

Re : Recherche fulltext : quel lexeme a été trouvé?

postgres=# select to_tsvector('restauration');
 to_tsvector 
-------------
 'restaur':1
(1 row)

postgres=# select to_tsvector('restaurant');
 to_tsvector 
-------------
 'restaur':1
(1 row)

postgres=# select to_tsvector('chinois');
 to_tsvector 
-------------
 'chinoi':1
(1 row)

J'aurais tendance à dire que restauration a faire une correspondance avec restaurant smile


Guillaume.

Hors ligne

#3 27/05/2016 11:37:18

thomasp
Membre

Re : Recherche fulltext : quel lexeme a été trouvé?

C'est en effet la solution de remplacement que j'ai trouvée, je fait une boucle sur tous les mots de ma phrase pour voir lequel correspond, mais c'est dommage, ça fait faire autant de recherches qu'il n'y a de mot dans ma phrase au lieu de n'en faire qu'une comme indiqué dans le premier post

Hors ligne

#4 27/05/2016 12:41:51

rjuju
Administrateur

Re : Recherche fulltext : quel lexeme a été trouvé?

Vous pouvez sinon utiliser ts_debug que vous pouvez comparer à votre tsvector :

select * from ts_debug('restaurant|chinois');
   alias   │   description   │   token    │  dictionaries  │  dictionary  │  lexemes  
═══════════╪═════════════════╪════════════╪════════════════╪══════════════╪═══════════
 asciiword │ Word, all ASCII │ restaurant │ {english_stem} │ english_stem │ {restaur}
 blank     │ Space symbols   │ |          │ {}             │ <NULL>       │ <NULL>
 asciiword │ Word, all ASCII │ chinois    │ {english_stem} │ english_stem │ {chinoi}
(3 rows)

Hors ligne

#5 27/05/2016 13:29:37

thomasp
Membre

Re : Recherche fulltext : quel lexeme a été trouvé?

J'avais regardé aussi du côté de ts_debug, mais ça ne convient pas, cette fonction me donne les infos de dictionnaire, mais ne me dira pas si mon document a été trouvé grâce à "restaurant" ou "chinois".
Merci tout de même!

Hors ligne

Pied de page des forums