Recentemente, tive que implementar uma busca de vizinho mais próximo em rails com postgres postgis.
Estou executando em:
– osx maverciks
– rails 4.03
– postgres 9.3.3
Criei o seguinte escopo em uma grande tabela de dados (400k entradas). A coluna lonlat tem um índice.
scope :closest, ->(point) {
where("ST_Distance(lonlat, ST_WKTToSQL('#{point.as_text}')) < 5000 ")
.order("ST_Distance(lonlat, ST_GeomFromText('#{point.as_text}', #{SRID}))").limit(5) }
Carga (748,7ms)
comparado com
scope :closest, ->(point)
where("lonlat && ST_Expand(ST_WKTToSQL('#{point.as_text}'), 5000)")
.order("ST_Distance(lonlat, ST_GeomFromText('#{point.as_text}', #{SRID}))").limit(5) }
Carga (1327,8ms)
então, a fim de acelerar sua consulta, parece que st_distance é muito mais rápido em comparação com a outra condição onde