Difference between revisions of "CheckTsearch"
Line 43: | Line 43: | ||
ALTER FUNCTION t_tsearch_trigger() OWNER TO ripp; | ALTER FUNCTION t_tsearch_trigger() OWNER TO ripp; | ||
</source> | </source> | ||
+ | |||
+ | et il faut aussi définir la fontion pltcl f_replace_chars | ||
+ | |||
+ | <source lang='tcl'> | ||
+ | -- Function: f_replace_chars(text) | ||
+ | |||
+ | -- DROP FUNCTION f_replace_chars(text); | ||
+ | |||
+ | CREATE OR REPLACE FUNCTION f_replace_chars(text) | ||
+ | RETURNS text AS | ||
+ | $BODY$ | ||
+ | declare | ||
+ | mytext alias for $1; | ||
+ | res text; | ||
+ | begin | ||
+ | res := translate(mytext, '¢¥²³¹×àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑõôöòóøÒÓÔÕÖØùúûüÙÚÛÜýÿÝŶ', | ||
+ | 'cY231xaaaaaaAAAAAAcCeeeeEEEEiiiiIIIInNooooooOOOOOOuuuuUUUUyyYY'); | ||
+ | res := replace(res, 'Þ' , 'TH'); | ||
+ | res := replace(res, 'þ' , 'th'); | ||
+ | res := replace(res, 'Ð' , 'DH'); | ||
+ | res := replace(res, 'ð' , 'dh'); | ||
+ | res := replace(res, 'ß' , 'ss'); | ||
+ | res := replace(res, '¦' , 'OE'); | ||
+ | res := replace(res, '¶' , 'oe'); | ||
+ | res := replace(res, 'Æ' , 'AE'); | ||
+ | res := replace(res, 'æ' , 'ae'); | ||
+ | res := replace(res, 'Œ' , 'OE'); | ||
+ | res := replace(res, 'œ' , 'oe'); | ||
+ | res := replace(res, '©' , 'C'); | ||
+ | res := replace(res, '®' , 'R'); | ||
+ | res := replace(res, '¾' , '3/4'); | ||
+ | res := replace(res, '¼' , '1/4'); | ||
+ | res := replace(res, 'µ' , 'mu'); | ||
+ | |||
+ | return res; | ||
+ | end; | ||
+ | |||
+ | $BODY$ | ||
+ | LANGUAGE 'plpgsql' VOLATILE | ||
+ | COST 100; | ||
+ | ALTER FUNCTION f_replace_chars(text) OWNER TO berthomg; | ||
+ | |||
+ | </source> | ||
+ | |||
+ | pour la database. Il la met dans catalog functions | ||
+ | |||
===Attention idxfti n'est pas mis à jour s'il y a déjà des données=== | ===Attention idxfti n'est pas mis à jour s'il y a déjà des données=== |
Revision as of 14:29, 3 September 2009
Tsearch permet d'indexer tous les mots des colonnes des table PostgreSql
Ces index sont mis à jour à chaque insert, update, delete.
On peut choisir les colonnes à traiter. Raymond a créé un outil web CheckTsearch :
Il suffit de lancer (il est dans le menu WebTools/WebSite d'un Fed).
http://lbgi.igbmc.fr/gx/phpRR/CheckTsearch.php?database=gx
En gros on affiche toutes les tables avec toutes leurs colonnes et on demande lesquelles doivent être sous tsearch. La colonne idxfti est créée si nécessaire.
Attention la suite "Il suffit... " marche mais ...
Concernant la database
Ca marche si la database est la base Fed dans laquelle on est.
Car il faut que php connaisse le PgDAO ... (ok pour GxDb, etc.). Voir le programme phpRR/CheckTsearch.php
Il faut la fonction trigger dans le Catalog de postgresql
Pour cela il fallait d'abord que je fasse
CREATE OR REPLACE FUNCTION t_tsearch_trigger()
RETURNS trigger AS
$BODY$
set tscol [lindex $args 0]
set tsconf [lindex $args 1]
set nbargs [llength $args]
set fullstr ""
for {set i 2} {$i <= $nbargs-1} {incr i} {
set col [lindex $args $i]
spi_exec "SELECT f_replace_chars('[quote $NEW($col)]') AS texte"
append fullstr $texte " "
}
spi_exec "SELECT to_tsvector('[quote $tsconf]','[quote $fullstr]') AS vect"
set NEW($tscol) $vect
return [array get NEW]
$BODY$
LANGUAGE 'pltcl' VOLATILE
COST 100;
ALTER FUNCTION t_tsearch_trigger() OWNER TO ripp;
et il faut aussi définir la fontion pltcl f_replace_chars
-- Function: f_replace_chars(text)
-- DROP FUNCTION f_replace_chars(text);
CREATE OR REPLACE FUNCTION f_replace_chars(text)
RETURNS text AS
$BODY$
declare
mytext alias for $1;
res text;
begin
res := translate(mytext, '¢¥²³¹×àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑõôöòóøÒÓÔÕÖØùúûüÙÚÛÜýÿÝŶ',
'cY231xaaaaaaAAAAAAcCeeeeEEEEiiiiIIIInNooooooOOOOOOuuuuUUUUyyYY');
res := replace(res, 'Þ' , 'TH');
res := replace(res, 'þ' , 'th');
res := replace(res, 'Ð' , 'DH');
res := replace(res, 'ð' , 'dh');
res := replace(res, 'ß' , 'ss');
res := replace(res, '¦' , 'OE');
res := replace(res, '¶' , 'oe');
res := replace(res, 'Æ' , 'AE');
res := replace(res, 'æ' , 'ae');
res := replace(res, 'Œ' , 'OE');
res := replace(res, 'œ' , 'oe');
res := replace(res, '©' , 'C');
res := replace(res, '®' , 'R');
res := replace(res, '¾' , '3/4');
res := replace(res, '¼' , '1/4');
res := replace(res, 'µ' , 'mu');
return res;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION f_replace_chars(text) OWNER TO berthomg;
pour la database. Il la met dans catalog functions
Attention idxfti n'est pas mis à jour s'il y a déjà des données
Il faut faire, pour toutes les tables t, colonnes c.
update t set c=c