Skip site navigation (1) Skip section navigation (2)

full text search fti

From: "Dario" <dario_d_s(at)unitech(dot)com(dot)ar>
To: 'PostgreSQL en Español' <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: full text search fti
Date: 2005-07-28 20:12:51
Message-ID: MHEDJHCKDNOEHJKHIOCJMEDHCFAA.dario_d_s@unitech.com.ar (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Estimados:
estuve probando estos productos, no se donde será el mejor lugar para pasar
esto pero tengo la lista de cosas (checklist?) que tuve que hacer para
implementarlos... Si bien es recomendable leer la doc, lo de fti está toda
en inglés.

FTI es muy simple y la verdad no mejoró la performance de mis querys... pero
no lo probé con carga de trabajo, aparte por algo parece estar
discontinuado, el readme plantea el caso de un indexación de dos campos de
la misma tabla, tal vez ahí tenga más gracia...

conclusión: voy a probar tsearch2 :-)

1) Implementación de fti en la tabla tabla.
2) "características"

1) Implementación de fti en la tabla tabla.

-- esta tabla sirve como repositorio de las palabras procesadas por fti
-- contiene un campo de texto donde guardar la palabra y otro con un puntero
al registro con la palabra original
create table tabla_fti (string varchar(900), id oid) ;   -- puse 900 porque
es el límite de mssql pero podría ser más

-- este trigger procesa las palabras y las inserta en la tabla repositorio.
create function fti() returns trigger as '/usr/lib/pgsql/fti.so' language
'C';

create trigger tabla_fti_tri after update or insert or delete on tabla
                    for each row execute procedure
fti(tabla_fti,columna_texto);

-- índice para la tabla repositorio por el campo que contiene las palabras
procesadas
create index tabla_fti_string_idx on tabla_fti (string);

-- índice para la tabla repositorio por el puntero a la tabla para mejorar
-- la performance cuando se dispara el trigger por borrado de elementos
create index tabla_fti_id_idx on tabla_fti (id);

-- índice por oid
create index tabla_oid_idx on tabla (oid);

-- búsqueda usando el índice
select distinct(tabla.oid) , tabla.id /* la primary key */,
tabla.columna_texto
from tabla, tabla
where tabla_fti.string ~ '^plata' and tabla_fti.id = tabla.oid;


para popular la tabla_fti, si la tabla con el campo a indexar ya tenía datos
se puede correr
un script perl, pero no me anduvo y no quiero ni se debugear perl... este
seria el comando.
       fti.pl -u -d basededatos -t tabla -c columna_texto -f
arch_para_importar_con_copy_de_psql

La opción "homero" es hacer un update de la tabla.
update tabla set columna_texto= columna_texto

2) "características" (aka problemas):
tuve problemas con una base con codificación unicode en lo que es separación
de palabras.
Por ejemplo la palabra "señor" la separa en "se" y "or", porque este módulo
no me reconoció caracteres internacionales.
Lo mismo pasa con acentos.

Probé indexar una tabla de 500 kb en disco y genera una tabla de 6000 kb,
aunque es achicable...
Una tabla de 50 mb me generó una tabla-índice de 120 mb

si el campo indexado de una tabla tiene como contenido:
'palabra palabra'
'otra'

el contenido de la tabla_fti tiene
string		id
palabra		1357264
alabra		1357264
labra			1357264
abra			1357264
bra			1357264
ra			1357264
palabra		1357264
alabra		1357264
labra			1357264
abra			1357264
bra			1357264
ra			1357264
otra			1557267
tra			1557267
ra			1557267

Es decir que se podría hacer que se compacte la tabla agrupando por string e
id
--primero dropeo indices
drop index tabla_fti_string_idx
drop index tabla_fti_id_idx
--renombro la tabla
alter table tabla_fti rename to tabla_fti_pre_cmpct
--creo la tabla agrupando por ambos campos
create table tabla_fti as select string::varchar(900), id::oid
					from tabla_fti_pre_cmpct
					group by string, id
					--order by string 	--creo que sería conveniente ordenar la tabla.
									--asi agrupo todas las palabras similares en
									--bloques cercanos entre si del file system,
									--pero no se si a nivel filesystem tiene sentido
--recrear los índices
create index tabla_fti_string_idx on tabla_fti (string);
create index tabla_fti_id_idx on tabla_fti (id);


Saludos.

Cambiar las palabras,
mejor no jurar
promesas cerradas.


In response to

pgsql-es-ayuda by date

Next:From: Pepe BallagaDate: 2005-07-28 20:16:53
Subject: duda sobre los ALIAS en pgpsql
Previous:From: Martín MarquésDate: 2005-07-28 19:22:14
Subject: Re: Bloquear registros

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group