El mar, 16-08-2016 a las 11:41 -0300, Guillermo E. Villanueva escribió:
> Gracias por las sugerencias Anthony, pruebo esa alternativa y les
> comento.
Guillermo creo que la sección del manual donde explican los distintos
tipos de diccionarios, como el de sinónimos, te puede servir de ayuda. 
https://www.postgresql.org/docs/current/static/textsearch-dictionaries.
html#TEXTSEARCH-SYNONYM-DICTIONARY
> Saludos!

> El 11 de agosto de 2016, 11:51, Anthony Sotolongo > <asotolo...@gmail.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 > > > <asotolo...@gmail.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',es> > > > > critodtxt)
> > > > >                             @@ to_tsquery('spanish','salta')
> > > > > 
> > > > >                     
> > > > > 
> > > > >                     
> > > > > 
> > > > >                     
> > > > > 
> > > > >                     > > > > > y tengo un índice creado
> > > > > 
> > > > >                     
> > > > > 
> > > > >                     
> > > > > 
> > > > >                     > > > > > 
> > > > >                       > > > > > CREATE INDEX fts_escritodtxt > > > > 
> > > > > > ON
> > > > >                           public.tescrito
> > > > > 
> > > > >                       > > > > >   USING gin > > > > > 
> > > > > (to_tsvector('spanish'::re> > > > > gconfig,
> > > > >                           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',es> > > > > critodtxt)
> > > > >                               @@ 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
> > > > 
> > > >             
> > > > 
> > > >           > > > 
> > >         
> > > 
> > >         
> > > 
> > >       
> > > 
> > >     
> > 
> >     
> > 
> >   
> > 
> > 
> > 


> 

Responder a