Difference between revisions of "CheckTsearch"

From Wikili
Jump to: navigation, search
(New page: 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 c...)
 
 
(9 intermediate revisions by 2 users not shown)
Line 5: Line 5:
 
On peut choisir les colonnes à traiter. Raymond a créé un outil web CheckTsearch :
 
On peut choisir les colonnes à traiter. Raymond a créé un outil web CheckTsearch :
  
Il suffit de lancer (il est dans le menu WebTools/WebSite).
+
Il suffit de lancer (il est dans le menu WebTools/WebSite d'un [[Fed]]).
  
 
   http://lbgi.igbmc.fr/gx/phpRR/CheckTsearch.php?database=gx
 
   http://lbgi.igbmc.fr/gx/phpRR/CheckTsearch.php?database=gx
Line 12: Line 12:
 
La colonne idxfti est créée si nécessaire.  
 
La colonne idxfti est créée si nécessaire.  
  
Attention la suite "Il suffit... " marche mais il fallait d'abord que je fasse
+
Attention la suite "Il suffit... " marche mais ...
  
<source lang='sql'>
+
===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
 +
 
 +
<source lang='tcl'>
 
CREATE OR REPLACE FUNCTION t_tsearch_trigger()
 
CREATE OR REPLACE FUNCTION t_tsearch_trigger()
 
   RETURNS trigger AS
 
   RETURNS trigger AS
Line 24: Line 32:
 
for {set i 2} {$i <= $nbargs-1} {incr i} {
 
for {set i 2} {$i <= $nbargs-1} {incr i} {
 
set col [lindex $args $i]
 
set col [lindex $args $i]
 +
                if {![info exists NEW($col)]} {continue}
 
spi_exec "SELECT f_replace_chars('[quote $NEW($col)]') AS texte"
 
spi_exec "SELECT f_replace_chars('[quote $NEW($col)]') AS texte"
 
append fullstr $texte " "
 
append fullstr $texte " "
Line 36: Line 45:
 
</source>
 
</source>
  
Attention idxfti n'est pas mis à jour. Il faut faire, pour toutes les tables t, colonnes c.
+
et il faut aussi définir la fonction f_replace_chars dans pg_catalog functions.
 +
 
 +
<source lang='tcl'>
 +
 
 +
set search_path to pg_catalog;
 +
 
 +
-- 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 ripp;
 +
 
 +
</source>
 +
 
 +
 
 +
===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
 
   update t set c=c

Latest revision as of 10:12, 15 October 2010

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]
                if {![info exists NEW($col)]} {continue}
		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 fonction f_replace_chars dans pg_catalog functions.

set search_path to pg_catalog; 

-- 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 ripp;


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