No último post baixamos e carregamos os dados para o PostgreSQL, hoje iremos dar sequencia no artigo, configurando a pesquisa Full-text.

A fim de fazer um mapa eficiente, temos que encontrar rapidamente os registros que têm as palavras que estamos interessados. Felizmente, o PostgreSQL fornece a facilidade de uma pesquisa de texto completo (full-text search) para a procura rápida e eficaz dos campos texto. Com ela é possível combinar automaticamente palavras diferentes-mas-semelhante (como “árvore” e “árvores”) e encontrar palavras particulares em grandes blocos de texto.

Nossos dados não são particularmente pesados ​​(a maioria dos nomes de lugares na nossa base de dados consistem em apenas duas palavras, apenas alguns têm três ou mais), mas full-text search ainda será mais eficiente do que uma simples correspondência de padrão, porque ele pode fazer uso do índice full-text.

O full-text faz uso de tipos do PostgreSQL especializadas: tsvector e tsquery.

Ele depende da criação de um índice no tsvector representando um (ou vários) campo de texto. Podemos ver o efeito do índice, executando uma consulta de teste antes e depois de construí-lo.

 -- Watch the timing of this query
SELECT Count(*) FROM geonames WHERE to_tsvector('english', name) @@ to_tsquery('english', 'oak');
-- Create the full-text index
CREATE INDEX geonames_fulltext_idx ON geonames USING GIN (to_tsvector('english', name));
-- Again, watch the timing of this query
SELECT Count(*) FROM geonames WHERE to_tsvector('english', name) @@ to_tsquery('english', 'oak');

Quando o nosso aplicativo envia de volta o texto a partir da interface web, o texto pode conter espaços. A função to_tsquery () não gosta de espaços, ela espera que cada palavra na string de consulta devem ser separados por “&”, “AND”, “|” ou “OR”.

Para resolver este problema e retirar qualquer espaço à na palavra, vamos usar a função trim().

-- Example of space trimming
SELECT trim('   New York ');

A seguir, vamos tratar todo o texto com espaços como consultas. Por isso, queremos substituir os espaços entre as palavras com o símbolo “&”.

-- Example of trimming and turning spaces into &s
SELECT regexp_replace(trim('  New  York '), E'\\s+', '&', 'g');

Finalmente, podemos colocar o resultado em um to_tsquery() executando na query atual.

-- Again, watch the timing of this query
SELECT Count(*)
FROM geonames
WHERE
 to_tsvector('english', name) @@
 to_tsquery('english', regexp_replace(trim('   New York '), E'\\s+', '&', 'g'));

Agora, imagine que “New York” poderia ser substituído por qualquer palavra que você quisesse, e que os resultados poderiam ser colocados em um mapa em tempo real! Isso é o que nós vamos configurar a seguir.

Para este artigo, vou considerar que o GeoServer está configurado com as camadas (em uma store PostGIS) e você criou um workspace com o nome “wordmap”.

Tendo dito isto, vamos configurar a nossa camada SQL View, indo na opção “Add Layer”.

newsqllayer1

Vamos setar o nome da nossa camada como geonames, com o SQL a seguir:

SELECT id, name, geom
FROM geonames
WHERE
 to_tsvector('english', name) @@
 to_tsquery('english', regexp_replace(trim('%word%'), E'\\s+', '&', 'g'))

Esta é basicamente a mesma consulta usada na seção anterior. Ela rapidamente encontra todos os registros em que o nome contém uma palavra particular. Neste caso, em vez de procurar por uma palavra particular, nós colocamos %word% como um parâmetro. Isso nos permite buscar qualquer palavra, apenas passando o parâmetro na URL.

Esta é basicamente a mesma consulta usada na seção anterior. Ela rapidamente encontra todos os registros em que o nome contém uma palavra particular. Neste caso, em vez de procurar por uma palavra particular, nós colocamos %word% como um parâmetro. Isso nos permite buscar qualquer palavra consulta do GeoServer, apenas passando o parâmetro na URL.

Depois de criar a SQL View, vá até a seção “SQL view parameters” e clique em “Guess parameters from SQL”:

– O parâmetro “word” deve estar preenchido na lista de parâmetros.
– Defina o valor padrão para “oceano”.
– Defina a “validação de expressão regular” para “^ [\ w \ d \ s] * $”
*Esta expressão permite apenas letras, números e espaços, incluindo os valores vazios.

sqlviewdetails1

Agora vá para seção “Attributes” e clique em “Refresh”. As colunas “id”, “nome” e “geom” devem ter sido inferidas a partir do SQL.

– Verifique se “id” está como identificador exclusivo.
– Defina o campo “geom” como ponto .
– Defina o “SRID” do “geom” para 4326 .

Agora salve as configurações do SQL View, e você será redirecionado diretamente para a página de configuração da camada.

Na tela de configuração de camada faça o seguinte:

Na aba “Data”:

– Declare SRS como EPSG:4326
– Gere os Bounding Boxes

Na aba “Tile Cache”:

– Na opção Tile Cache, desmarque a opção “Criar camada de cache para esta camada”
– Clique em “Salvar”

Agora você tem uma camada visível!

preview_ocean

Para testar se a camada funcionou, vamos realizar um teste:

http://localhost:8080/geoserver/wms/reflect?layers=wordmap:geonames&viewparams=word:navajo

Comparando com a imagem acima, é possível verificar que houve uma mudança, mas que é difícil de interpretar sem uma mapa base. No próximo post iremos construir um interface web para que possamos explorar esta camada dinâmica.

map-navajo