Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[PostgreSQL] FULLTEXT index

1 réponse
Avatar
JKB
Bonjour,

Je suis en train de regarder de près la nouveauté que sont les index
FULLTEXT dans PostgreSQL 8.3 et j'ai quelques petites interrogations
(ou problèmes...).

Considérons une table définie comme :

routing=# \d communes
Table « public.communes »
Colonne | Type |
Modificateurs
--------------------------+-----------------------+--------------------------------------------------------
gid | integer | not null default
nextval('communes_gid_seq'::regclass)
area_id | bigint |
area_name | character varying(35) |
lang_code | character varying(3) |
textsearchable_index_col | tsvector |
Index :
« communes_pkey » PRIMARY KEY, btree (gid)
« communes_id » btree (area_id)
« communes_name » btree (area_name)
« textsearch_idx » gin (textsearchable_index_col)

routing=#

area_name est le nom de la commune (française), area_id est un
entier correspondant à une partie de la commune en question.

J'ai créé une colonne textsearchable_index_col par la commande
suivante :

update communes set textsearchable_index_col = to_tsvector('french', area_name);

puis un index sur cette colonne :

create index textsearch_idx on communes using gin(textsearchable_index_col);

Considérons maintenant que je recherche les références de Paris dans
la table communes :

select area_name, textsearchable_index_col,
ts_rank_cd(textsearchable_index_col, query) as rank from communes,
to_tsquery('french', 'paris') query where query @@
textsearchable_index_col order by rank desc;

me renvoie :

area_name | textsearchable_index_col
| rank
------------------------+-------------------------------------------------------
+------
PARIS | 'paris':1
| 0.1
PARIS | 'paris':1
| 0.1
LE PETIT PARIS | 'pet':2 'paris':3
| 0.1
PARIS | 'paris':1
| 0.1
CORMEILLES-EN-PARISIS | 'paris':4 'cormeil':2 'cormeilles-en-paris':1
| 0.1
CORMEILLES-EN-PARISIS | 'paris':4 'cormeil':2 'cormeilles-en-paris':1
| 0.1
FONTENAY-EN-PARISIS | 'paris':4 'fontenay':2 'fontenay-en-paris':1
| 0.1
FONTENAY-EN-PARISIS | 'paris':4 'fontenay':2 'fontenay-en-paris':1
| 0.1
PARIS | 'paris':1
| 0.1
PARIS | 'paris':1
| 0.1
PARIS | 'paris':1
| 0.1
LA RUE DE PARIS | 'ru':2 'paris':4
| 0.1
LE TOUQUET-PARIS-PLAGE | 'plag':5 'paris':4 'touquet':3
'touquet-paris-plag':2
| 0.1
LE TOUQUET-PARIS-PLAGE | 'plag':5 'paris':4 'touquet':3
'touquet-paris-plag':2
| 0.1
LE PETIT PARIS | 'pet':2 'paris':3
| 0.1
PARIS-L'HÔPITAL | 'paris':2 'paris-l':1 'hôpital':4
| 0.1
PARIS-L'HÔPITAL | 'paris':2 'paris-l':1 'hôpital':4
| 0.1
(17 lignes)

Première question : pourquoi la troisième ligne contient-elle
'pet':2 'paris':3 au lieu de 'petit':2 'paris':3 ? Même question
pour 'plag'. Le problème ne semble pas provenir du dictionnaire.
J'ai essayé avec 'english' et sur Linux, Solaris et NetBSD pour
isoler les variables ;-)

Seconde question : pourquoi tous les rangs sont-ils identiques ?
Le but ultime est de récupérer un nom de lieu indépendamment des
phôtes d'auretograffes de l'utilisateur. J'aimerais donc que le rank
donne une vraisemblance. Je viens de lire toute la doc de PostgreSQL
8.3 et j'avoue ne pas avoir trouvé...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.

1 réponse

Avatar
JKB
Le 18-03-2008, à propos de
[PostgreSQL] FULLTEXT index,
JKB écrivait dans fr.comp.applications.sgbd :
Bonjour,

Je suis en train de regarder de près la nouveauté que sont les index
FULLTEXT dans PostgreSQL 8.3 et j'ai quelques petites interrogations
(ou problèmes...).

Considérons une table définie comme :

routing=# d communes
Table « public.communes »
Colonne | Type |
Modificateurs
--------------------------+-----------------------+--------------------------------------------------------
gid | integer | not null default
nextval('communes_gid_seq'::regclass)
area_id | bigint |
area_name | character varying(35) |
lang_code | character varying(3) |
textsearchable_index_col | tsvector |
Index :
« communes_pkey » PRIMARY KEY, btree (gid)
« communes_id » btree (area_id)
« communes_name » btree (area_name)
« textsearch_idx » gin (textsearchable_index_col)

routing=#

area_name est le nom de la commune (française), area_id est un
entier correspondant à une partie de la commune en question.

J'ai créé une colonne textsearchable_index_col par la commande
suivante :

update communes set textsearchable_index_col = to_tsvector('french', area_name);

puis un index sur cette colonne :

create index textsearch_idx on communes using gin(textsearchable_index_col);

Considérons maintenant que je recherche les références de Paris dans
la table communes :

select area_name, textsearchable_index_col,
ts_rank_cd(textsearchable_index_col, query) as rank from communes,
to_tsquery('french', 'paris') query where query @@
textsearchable_index_col order by rank desc;



Au fait, second interrogation... Comment mettre un nom avec des
traits d'union dans la requête (du style Husseren-Wesserling) ?
J'ai à chaque fois une erreur...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.