Re: FTS

From: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
To: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: FTS
Date: 2016-08-16 14:41:33
Message-ID: CANm+PCCOs6pjZUa9w5vPjhAiBSfVMkisxL+BYrcS5kKfFSLhqg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias por las sugerencias Anthony, pruebo esa alternativa y les comento.
Saludos!

El 11 de agosto de 2016, 11:51, Anthony Sotolongo <asotolongo(at)gmail(dot)com>
escribió:

> Hola Guillermo
>
> On 11/08/16 08:54, Guillermo E. Villanueva wrote:
>
> Anthony muchas gracias por tus explicaciones. Es como dices, la palabra
> "salta" está en el 99% de los registros, en este caso se refiere a la
> provincia llamada Salta y no al verbo saltar. ¿No hay manera de forzar a
> que el lexema de Salta sea "Salta"? como cuando buscamos en google con
> comillas.
>
> Tal vez puede que te ayude con esto definir tu propio diccionario
> personalizado (nunca lo he tenido que hacer, pero una vez vi que se puede
> hacer :D).
> O tal vez probar con el truco de diccionarios distintos en las búsquedas e
> indices para forzar a que un lexema sea distinto del idioma nativo y
> permita indexar más palabras, esto creo que provoca que el indice sea más
> grande (no se cuando bueno o efectivo puede ser eso en tu caso, pues
> incluso las stop words son distintas)
>
> por ejemplo se obtienen lexemas distintos para idiomas distintos con la
> misma frase,
>
> select to_tsvector('english','Salta es una provincia');
> "'es':2 'provincia':4 'salta':1 'una':3"
>
> select to_tsvector('spanish','Salta es una provincia')
> "'provinci':4 'salt':1"
>
>
> saludos
>
> Creo que una alternativa sería agregarle otra condición con LIKE pero ya
> no usaría índice ni las virtudes de FTS.
> Muchas gracias de nuevo.
>
> Guillermo
>
> El 10 de agosto de 2016, 17:52, Anthony Sotolongo <asotolongo(at)gmail(dot)com>
> escribió:
>
>> 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

  • Re: FTS at 2016-08-11 14:51:03 from Anthony Sotolongo

Responses

  • Re: FTS at 2016-08-24 11:19:58 from jaime soler

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alberto Cuevas 2016-08-23 13:38:35 Clientes conectados
Previous Message Guillermo E. Villanueva 2016-08-16 10:39:07 Re: Verificar precios de productos