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...).
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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.
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.