RE: checklist tsearch2

From: "Dario" <dario_d_s(at)unitech(dot)com(dot)ar>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: checklist tsearch2
Date: 2005-08-01 13:12:47
Message-ID: MHEDJHCKDNOEHJKHIOCJMEFGCFAA.dario_d_s@unitech.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Error mio: si existe un diccionario en español. (como no va a existir)

Y para usarlo, más vale que sigan los pasos de alguien que sepa :-)
Si se me permite dejo un link. Lenguajes naturales. Muy práctico e
interesante de leer.
http://www.gwolf.org/soft/

Saludos, perdón por el ruido!

-----Mensaje original-----
De: pgsql-es-ayuda-owner(at)postgresql(dot)org
[mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org]En nombre de Dario
Enviado el: sábado, 30 de julio de 2005 22:41
Para: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: [pgsql-es-ayuda] checklist tsearch2

Implementación de tsearch2 en una tabla. (mini-how-to)
Este buscador trabaja con un diccionario para parsear información. El
concepto es que un diccionario diga la palabra base de la palabra al momento
del indexado.
Convertir "generalizar" en "general" cuando indexa.
Al buscar "generalizar", nos devuelve generalizar y también general.

SELECT lexize('en_ispell', 'conditionally'); ---esta instrucción la usa
internamente
lexize
-----------------------------
{conditionally,conditional}

No funciona como like. No hace búsqueda de palabras parciales.

Del tsearch2 TO_DO (a hacer)
prefix search - could be implemented as a separate operation but without
index support. It should be faster than ~,LIKE built-in operations because
tsvector contains already parsed and sorted words.

"pero la idea es esa"

No existe ningún diccionario en español, la funcionalidad está limitada a
filtrar palabras...

Para usar tsearch2 primero se debe definir un diccionario, que no es más que
un conjunto de definiciones que nos van permitir procesar las palabras a
indexar.

select * from pg_ts_dict;

dict_name | dict_init | dict_initoption |
dict_lexize | dict_comment
...
en_stem | snb_en_init(text) | contrib/english.stop |
snb_lexize(internal,internal,integer) | English Stemmer. Snowball.
...

INSERT INTO pg_ts_dict -- se toma la configuración del
filtrador en ingles
-- se cambia lo mínimo necesario para que lo haga
-- en español
(SELECT 'es_stem', --nombre del diccionario
dict_init, --inicializador de diccionario
'contrib/spanish.stop', --parametro del
diccionario, en este caso
--una lista de palabras que no se quiere --indexar ni
buscar
dict_lexize, 'Spanish stemmer.' -- proceso
leximizador, comentario
FROM pg_ts_dict
WHERE dict_name = 'en_stem');

-- Se crea una configuración y se la asocia al locale es_AR.
INSERT INTO pg_ts_cfg (ts_name, prs_name, locale)
VALUES ('default_spanish', 'default', 'es_AR');

--En el cfgmap se asocia la configuración recién creada con el diccionario
-- creado anteriormente, nuevamente se copia el mapeo del filtrador en
inglés
insert into pg_ts_cfgmap (
select 'default_spanish', tok_alias, dict_name
from pg_ts_cfgmap
where 'default' = ts_name)

-- y se modifica oportunamente.
update pg_ts_cfgmap set dict_name = '{es_stem}'::_text
where 'default_spanish' = ts_name and dict_name = '{en_stem}'
-- este mapeo tiene varios registros que el tsearch usa internamente.

-- teniendo definida
create table tabla (texto text);

--A la tabla que se necesita indexar se le debe agregar una columna

alter table tabla add column vector tsvector -- del tipo tsvector

-- se crea el trigger que va a actualizar la columna al modificarse un
registro
CREATE OR REPLACE FUNCTION tsearch2()
RETURNS "trigger" AS
'$libdir/tsearch2', 'tsearch2'
LANGUAGE 'c' VOLATILE;

CREATE TRIGGER vectorupdate BEFORE INSERT OR UPDATE ON tabla
FOR EACH ROW EXECUTE PROCEDURE tsearch2('vector', 'texto')

--se setea la configuración para que use el filtro deseado
SELECT set_curcfg('default_spanish'); --cuando el locale del equipo sea
es_AR va a tomar
-- la cfg default_spanish automaticamente y esto
-- no seria necesario

-- debe actualizarse la tabla (si es necesario) para que el campo vector
-- contenga el "texto" procesado
UPDATE tabla SET vector=to_tsvector(texto);
VACUUM FULL ANALYZE tabla;

-- se crea un índice en la columna
create index vector_idx on tabla using gist (vector)
VACUUM FULL ANALYZE tabla;

--Ejemplo
insert into tabla values ('no contaban con mi astucia')
--En el campo vector se va a encontrar algo como
vector
--------------------------
'astucia':5 'contaban':2

-- se pueden realizar las busquedas usando el índice (al fin)
select * from tabla where vector @@ to_tsquery('astucia')

-- al quererse buscar aquellos textos donde se encuentren las palabras
astucia y contaban:
select * from tabla where vector @@ to_tsquery('astucia&contaban')

si queremos buscar por frase... bueno, no, pero hay un rebusque.
select * from tabla where vector @@ to_tsquery('astucia&contaban')
and texto ilike '%no contaban con mi astucia%'

Este módulo permite devolver un ranking (no explicado aca)

1) Si alguno implementó diccionario en español y es tan gentil de pasar
info, files y knowledge...
2) ojala le sirva a alguien, en algún momento para algo.

Gracias.
Saludos.

"¡y que no panda el cúnico!"

---------------------------(fin del mensaje)---------------------------
TIP 1: para suscribirte y desuscribirte, visita
http://archives.postgresql.org/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2005-08-01 14:26:20 Fwd: Problemas con el espacio en disco
Previous Message Alicia Mc Millan Barrera 2005-08-01 12:51:08 unsuscribe