Re: Bsqueda indexada de substrings

From: dario_d_s(at)unitech(dot)com(dot)ar
To: Guillermo Schulman <gschulman_ml(at)yahoo(dot)com(dot)ar>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, lista de correo de postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Bsqueda indexada de substrings
Date: 2005-08-05 21:35:36
Message-ID: 1123277736.7000@netbox.unitech.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

This is a multi-part message in MIME format.

--bound1123277736
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

okey, perdì el mail q estaba redactando, asi q resumo.

Esa cadena es muy corta. Amsterdam, amsa... depende de tu juego de datos.

select * from tabla where campo % 'ams' and campo ilike '%ams%'

correrlo con un explain adelante para asegurarte que primero usa el índice y después filtra por el ilike.

con el % forzas el uso de índice, y esa cadena es muy corta, es probable que no sea muy selectiva (i registros + i reg * seeks en el índice) y que tengas peor performance que con un ilike pelado (j registros, no mucho más grande que i). Depende de tu hardware y los costos configurados en el planeador de consultas)

Saludos veloces.

Guillermo Schulman wrote ..
> Gracias Alvaro.
> Probé esa herramienta pero aparentemente no es la solución. Instalé el
> contrib pg_trgm. Creé la tabla con el índice como lo indica la
> documentación, pero al momento de usar el operador '%' no retorna los
> resultados esperados.
> El operador '%' retorna TRUE si ambos argumentos son "similares". Para
> ser "similares" el resultado de la función similarity(text, text) entre
> ambos argumentos debe ser superior al límite seteado en set_limit(real).
>
> Por ejemplo:
>
> select similarity('Ames', 'AMS') = 0.285714
> select similarity('Williams', 'AMS') = 0.181818
>
> Indefectiblemente si quiero que retorne 'Williams' (como lo haria el
> LIKE) debo hacer set_limit(0.181818>real) pero de esa manera me retorna
> tambien 'Ames' (cosa que el LIKE no haria).
>
> Les recuerdo que mi intención es simplemente la búsqueda de substrings
> dentro de un campo de texto (varchar, text o lo que sea).
> Es decir, ¿existe una manera de solucinar esto en pg_trgm para que se
> comporte como el LIKE o, en su defecto, existe otra herramienta que
> tenga el mismo comportamiento que el LIKE pero que sea más eficiente?
> Gracias nuevamente.
>
> Alvaro Herrera wrote:
>
> >On Fri, Aug 05, 2005 at 10:37:38AM -0300, Guillermo Schulman wrote:
> >
> >
> >>Hola a todos.
> >>Estoy buscando alguna forma para la búsqueda indexada de substrings en
> >>un campo. Es decir, en un campo que contiene nombres quiero buscar todos
> >>aquellos que contengan, en cualquier lugar de la cadena, un determinado
> >>subtexto y, fundamentalmente, esta búsqueda DEBE ser indexada dado el
> >>tamaño de la tabla y la frecuencia de esta consulta.
> >>
> >>
> >
> >Para substrings puedes tratar de usar pg_tgrm, que hace busquedas por
> >trigramas.
> >
> >
> >

--bound1123277736--

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Grover Navia 2005-08-05 21:36:15 RE: visual basic y postgresql
Previous Message Guillermo Schulman 2005-08-05 19:18:09 Re: Búsqueda indexada de substrings