Re: FTS

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: FTS
Date: 2016-08-10 20:52:01
Message-ID: df745806-d319-3687-2849-2f314cfaf757@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Guillermo

On 10/08/16 12:32, Guillermo E. Villanueva wrote:
> Buenas tardes , he leído sobre el tema Postgres y FTS en varios sitios
> y lo he utilizado varias veces pero al decir verdad, sigo
> entendiendolo muy poco.
> Si alguno tiene tiempo y puede ayudarme, les comento mi inquietud.
>
> Tengo la siguiente consulta:
> SELECT *
> FROM tescrito t
> WHERE to_tsvector('spanish',escritodtxt) @@
> to_tsquery('spanish','*salta*')
>
> y tengo un índice creado
>
> CREATE INDEX fts_escritodtxt ON public.tescrito
> USING gin (to_tsvector('spanish'::regconfig, escritodtxt));
>
> La tabla tiene 65300 registros
> El planificado me dice que realizará un seq scan y de hecho, la
> consulta demora mucho.
> Si cambio la palabra a buscar, por ejemplo por 'casa'
> SELECT *
> FROM tescrito t
> WHERE to_tsvector('spanish',escritodtxt) @@
> to_tsquery('spanish','*casa*')
>
> Entonces demora menos y el planificador ahora dice que si utilizará el
> índice.
>
> Preguntas:
> En que se basa postgres para decidir si utiliza o no el índice si lo
> único que cambié es la palabra a buscar?
Tengo entendido que se basa en las estadísticas para ver si usa el
indice o no, por ejemplo puede que el optimizador considere que es
mejor escanear la tabla completa antes de usar un indice, pues el
resultado está en un porciento grande de la tabla ( no se el porciento
exacto :( ), ejemplo:
De:
explain analyze
select * from customers where customerid >10000

Obtenemos:
"Index Scan using customers_pkey on customers (cost=0.29..538.29
rows=10000 width=268) (actual time=0.019..1.764 rows=10000 loops=1)"
" Index Cond: (customerid > 10000)"
"Planning time: 0.113 ms"
"Execution time: 2.064 ms"

Y de:
explain analyze
select * from customers where customerid >1000

Obtenemos:
"Seq Scan on customers (cost=0.00..738.00 rows=19000 width=268) (actual
time=0.273..3.120 rows=19000 loops=1)"
" Filter: (customerid > 1000)"
" Rows Removed by Filter: 1000"
"Planning time: 0.189 ms"
"Execution time: 3.640 ms"

Como ves con solo cambiar el valor del customerid el optimizador usa el
indice o no, y este optimizador de PostgreSQL ha resultado ser inteligente.
pero si consideras tu que no esta bien la decisión del optimizador
puedes "tomar el toro por los cuernos" y obligarlo a que use el indice
por ejemplo:
set enable_seqscan = off;
explain analyze
select * from customers where customerid >1000;

Obtenemos:
"Index Scan using customers_pkey on customers (cost=0.29..1019.79
rows=19000 width=268) (actual time=0.013..5.099 rows=19000 loops=1)"
" Index Cond: (customerid > 1000)"
"Planning time: 0.076 ms"
"Execution time: 5.820 ms"

vaya que se demora más con el indice que con el scan para el customerid
>1000

> Será que el tsquery de 'salta' es una palabra que no se indexa?
el to_tsvector obtiene los siguientes lexemas(donde esta 'salta'):
SELECT to_tsvector('spanish','saltar un muro que es bien alto');
"'alto':7 'bien':6 'mur':3 'salt':1"

puede que 'salt' que es el lexema de 'salta' sea un porciento grande de
la tabla y por eso el decide no usar el indice (de todos modos puedes
forzarlo a usar el indice con set enable_seqscan = off; , vaya ser que
se equivoque el optimizador, prueba a ver si se equivoca el optimizador )

> Para el caso de 'spanish' Aparte de crear el índice es necesario crear
> o configurar algo mas?
hasta donde yo lo he usado no me ha sido necesario configurar más nada,
pero puede que haya que hacer algo más para lo que requieres
> Desde ya les agradezco la ayuda que me puedan brindar.
> Saludos
>
> Guillermo
>
Saludos

In response to

  • FTS at 2016-08-10 16:32:08 from Guillermo E. Villanueva

Responses

  • Re: FTS at 2016-08-11 12:54:28 from Guillermo E. Villanueva

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message jvenegasperu . 2016-08-10 21:17:08 Tipo de dato para no tener problemas con el redondeo
Previous Message Guillermo E. Villanueva 2016-08-10 16:32:08 FTS