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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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