hola Lista

Tenemos una base con twitter y queremos  identificar aquellos que son
copiados y pegados pero que vendrian a ser el mismo y no se identifican
como retwitter...por ejemplo tenemos estos dos twitter

Nueva alianza de @ConnectAmericas y @camaracomerbog a disposición de
empresarios y empresas http://t.co/AQDeppDtso #Noticia

RT @bidcomercio: Nueva alianza de @connectamericas y @camaracomerbog a
disposición de empresarios y empresas http://t.co/f0Ky2564Lk #Noticia

Ambos son en esencia igual y  por medio de la función de similaridad
(similarity extension pg_trgm) identificamos que poseen una calificación
0.725, lo que nos permite concluir que son iguales en esencia. El problema
surge cuando ya queremos comparar la tabla completa con  2'418.356
registros aproximadamente (la partición de un mes), pues el join entre
tablas seria la función de similaridad, la consulta que construí después de
leer e investigar fue:

SELECT set_limit(0.7);

select a.texto,b.texto,similarity(a.texto,b.texto)
from  particiontwitter.tweets_2015_01 as a
join  particiontwitter.tweets_2015_01 as b on
a.retweeted_status is NULL and LENGTH(a.texto) > 120
and b.retweeted_status is NULL and LENGTH(b.texto) > 120
and a.texto % b.texto
and a.id<>b.id

tengo los siguiente indices creados relevantes para la consulta:

CREATE INDEX idx_tweets_trgm_2015_01 ON particiontwitter.tweets_2015_01
USING gin (texto COLLATE pg_catalog."default" gin_trgm_ops);
CREATE INDEX idx_tweets_trgm_gist_2015_01 ON
particiontwitter.tweets_2015_01 USING gist  (texto COLLATE
pg_catalog."default" gist_trgm_ops);
CREATE INDEX idx_tweets_comp3_2015_01 ON particiontwitter.tweets_2015_01
USING btree (retweeted_status COLLATE pg_catalog."default",
length(texto::text));

Y el plan de ejecución generado es:

Nested Loop  (cost=487.15..485794.60 rows=38938 width=281)
  ->  Bitmap Heap Scan on tweets_2015_01 a  (cost=487.06..14814.10
rows=10808 width=148)
        Recheck Cond: ((retweeted_status IS NULL) AND (length((text)::text)
> 120))
        ->  Bitmap Index Scan on idx_tweets_comp3_2015_01
(cost=0.00..486.52 rows=10808 width=0)
              Index Cond: ((retweeted_status IS NULL) AND
(length((texto)::text) > 120))
  ->  Index Scan using idx_tweets_trgm_gist_2015_01 on tweets_2015_01 b
(cost=0.08..43.56 rows=4 width=133)
        Index Cond: ((a.texto)::text % (texto)::text)
        Filter: ((retweeted_status IS NULL) AND ((a.id)::text <>
(id)::text) AND (length((texto)::text) > 120))



 El problema es que no termina!!! lo he dejado correr un día y medio sobre
solo el mes de enero y no finalizo y supuestamente debemos correrlo para
todo lo que va el 2015... he intentado con FTS pero tampoco funciono...
como puedo hacer para optimizar  mejor y/o replantear la consulta o en
general la manera de realizar la comparación  que me permita obtener
resultados en un tiempo menor ? De antemano gracias!!!
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a