Banco de Dados

5 out, 2018

Melhorando a Experiência do Usuário com Azure Search – Parte 05: apresentando resultados

Publicidade

Quando falamos de mecanismos de busca, pesquisar uma base de conhecimento é só metade do problema. É preciso considerar como exibir resultados.

Em geral, precisamos de uma lista razoavelmente pequena e bem focada de resultados para melhorar a eficiência do trabalho.

Os principais recursos e estratégias para apresentar resultados disponíveis no Azure Search são o objeto deste artigo.

Ordenando resultados

Este é um recurso simples, que pode causar um grande efeito na sua busca. Por default, os resultados são ordenados por sua nota ou “score”. Mas podemos escolher qualquer outro campo da base de conhecimento que tenha sido definido como “SORTABLE” durante a criação da base de conhecimento.

Para a base que criei, algumas formas de ordenação são realmente interessantes: ordenar resultados por data de publicação (DATA), veículo da publicação (MIDIA), ou pela lista de autores (AUTOR).

O exemplo a seguir combina um filtro e ordenadores numa única busca. Listo apenas os títulos que tenho publicados no portal SQL Server Central e ordeno resultados em ordem decrescente de data de publicação.

Body (resultado):

{
    "@odata.context": "https://wcrivelini-test1.search.windows.net/indexes('publications')/$metadata#docs(TITULO)",
    "@odata.count": 4,
    "value": [
        {
            "@search.score": 1,
            "TITULO": "SQL and the JOIN Operator"
        },
        {
            "@search.score": 1,
            "TITULO": "Do You Really Need Surrogate Keys? Part 1 – Concepts and Methods"
        },
        {
            "@search.score": 1,
            "TITULO": "Database Modeling and Diagrams with SQL Server 2008"
        },
        {
            "@search.score": 1,
            "TITULO": "Cursors for T-SQL Beginners"
        }
    ]
}

Uma aplicação interessante deste recurso é quando ordenamos resultados de busca com relação à proximidade geográfica com o lugar onde o usuário se encontra. Obviamente isso vai exibir que sua base de conhecimento inclua as coordenadas de latitude e longitude (por exemplo, uma base de conhecimento que descreve as filiais da empresa), além de usar a função GEO.DISTANCE para calcular distância desta posição até a posição do usuário.

Navegação padrão

Por default, a navegação nos resultados do Azure Search é feita via paginação, e utilizamos parâmetros TOP e SKIP para apresentar os documentos. Estes parâmetros funcionam de forma idêntica a outras linguagens: o SKIP descarta N resultados e o TOP seleciona outros N resultados.

É importante lembrar que os parâmetros SKIP e TOP devem trabalhar em conjunto para fins de paginação, mas eles também funcionam separadamente caso seja necessário.

O exemplo a seguir mostra a paginação dos resultados de artigos que publiquei no portal iMasters, exibindo a segunda página de 10 artigos, de um total de 68 resultados listados em ordem decrescente de DATA.

Body (resultado):

{
    "@odata.context": "https://wcrivelini-test1.search.windows.net/indexes('publications')/$metadata#docs(TITULO)",
    "@odata.count": 68,
    "value": [
        {
            "@search.score": 1,
            "TITULO": "Trabalhando com tabelas particionadas"
        },
        {
            "@search.score": 1,
            "TITULO": "Quando o MSDB cresce demais"
        },
        {
            "@search.score": 1,
            "TITULO": "Identificando tabelas sem índices"
        },
        {
            "@search.score": 1,
            "TITULO": "Servidores registrados: executando operações em todo ambiente"
        },
        {
            "@search.score": 1,
            "TITULO": "Índices e o excesso de coisa boa – Parte 03: objetos grandes demais"
        },
        {
            "@search.score": 1,
            "TITULO": "Índices e o excesso de coisa boa – Parte 02: objetos sem uso"
        },
        {
            "@search.score": 1,
            "TITULO": "Índices e o excesso de coisa boa – Parte 01: identificando casos críticos"
        },
        {
            "@search.score": 1,
            "TITULO": "SQL Server Físico vs Lógico - Parte 3"
        },
        {
            "@search.score": 1,
            "TITULO": "Sobre SQL Hints, Humildade e Canja de Galinha"
        },
        {
            "@search.score": 1,
            "TITULO": "SQL Server Físico vs Lógico - Parte 2"
        }
    ]
}

Destacando resultados

O Azure Search também permite destacar um resultado, funcionalidade que já virou padrão em grande parte das aplicações de busca. A forma de se obter este resultado é bastante simples: basta incluir na consulta a propriedade “highlight” e informar em quais campos serão destacados os termos da busca.

Veja este exemplo.

Body (resultado):

{
    "@odata.context": "https://wcrivelini-test1.search.windows.net/indexes('publications')/$metadata#docs",
    "@odata.count": 2,
    "value": [
        {
            "@search.score": 0.4950139,
            "@search.highlights": {
                "TITULO@odata.type": "#Collection(String)",
                "TITULO": [
                    "Usando Expressões de Tabela (CTEs) Recursivas no <em>DB2</em>"
                ]
            },
            "id": "77",
            "MIDIA": "IBM DeveloperWorks",
            "LINGUA": "Português",
            "AUTOR": "Wagner Crivelini",
            "TITULO": "Usando Expressões de Tabela (CTEs) Recursivas no DB2",
            "TEMA": "Alguns recursos do DB2 estão disponíveis há muito tempo, mas pouca gente usa. Isto acontece com uma funcionalidade das expressões de tabela (as CTEs, da sigla em inglês Common Table Expressions), que é suportada pelo DB2 desde 2004. Muita gente conhece e usa as CTEs, mas poucos desenvolvedores sabem que podem incluir recursividade em suas CTEs. As CTEs recursivas oferecem grande versatilidade para nossas declarações SQL e o DB2 também as suporta há muito tempo. Estranhamente, este é um recurso pouco conhecido.",
            "DATA": 41163,
            "LINK": "https://www.ibm.com/developerworks/br/local/data/cte_recursivas_db2/",
            "TAGS": "CTE"
        },
        {
            "@search.score": 0.32053876,
            "@search.highlights": {
                "TITULO@odata.type": "#Collection(String)",
                "TITULO": [
                    "DBA 101: administrando estruturas de dados do <em>DB2</em>"
                ]
            },
            "id": "76",
            "MIDIA": "IBM DeveloperWorks",
            "LINGUA": "Português",
            "AUTOR": "Wagner Crivelini",
            "TITULO": "DBA 101: administrando estruturas de dados do DB2",
            "TEMA": "Entendendo os conceitos de Tablespace, Bufferpool, Extent e Container",
            "DATA": 41215,
            "LINK": "https://www.ibm.com/developerworks/br/local/data/dba_101_administrando_estruturas_dados_db2/",
            "TAGS": "físico"
        }
    ]
}

Como se vê, foram encontrados apenas dois documentos que atenderam ao critério de pesquisa, sendo que ambos apresentaram a palavra “DB2”. Por conta disso, foram geradas marcações HTML (“<em></em>”) para destaque ou ênfase do texto desejado. Estas marcações são apresentadas no quadro acima na cor azul.

Navegação facetada

Este tipo de navegação é largamente utilizado hoje em dia, especialmente em grandes sites de vendas online. Esta navegação permite que o próprio usuário aplique seus filtros enquanto analisa os resultados apresentados por sua aplicação de busca. Veja na imagem a seguir um exemplo de aplicação com navegação facetada (fonte: documentação do Azure Search).

O uso deste tipo de navegação requer uma preparação da base de conhecimento, que precisa identificar quais campos são “FACETABLE”, ou seja, que campos que podem ser usados para navegação facetada. O grande problema é que os campos e propriedades de um índice não são editáveis: pode-se acrescentar campos, mas não alterar ou excluí-los. Mais uma vez observamos a importância de um bom planejamento de tudo que se espera fazer com uma base de conhecimento antes de se criar o índice.

No caso da base que eu utilizo nesta série de artigos, o índice publications não previu uso de nenhum campo para navegação facetada. Nesta situação, a única saída é reconstruir o índice utilizado.

Num índice pequeno, este processo é bem rápido. Mas a situação pode ser muito diferente dependendo da quantidade e tamanho dos documentos envolvidos, podendo deixar sua aplicação ou site fora do ar por horas, se não dias.

A figura a seguir mostra a nova configuração do índice publications.

Veja a seguir como retornar um resultado facetado. Por simplificação e clareza, uso o método POST para destacar cada elemento informado. A consulta apresenta os campos TITULO e TAGS dos artigos que publiquei no portal iMasters, listando os resultados em ordem decrescente de DATA e, além de tudo, permitindo navegação facetada por AUTOR.

Veja que o Azure Search acrescentou um bloco com cada rótulo encontrado no campo AUTOR e mais a contagem dos resultados obtidos para cada um dos casos. Neste exemplo, foram encontrados apenas dois rótulos distintos, como vemos a seguir.

Body raw:

{
     "search": "*"
   , "count": true
   , "queryType":"full"
   , "select": "TITULO,TAGS"
   , "filter": "MIDIA eq 'iMasters'"
   , "orderby": "DATA desc"
   , "facets":["AUTOR"]
}

Body (resultado):

(-- amostra do resultado)
{
    "@odata.context": "https://wcrivelini-test1.search.windows.net/indexes('publications')/$metadata#docs(TITULO,TAGS)",
    "@odata.count": 68,
    "@search.facets": {
        "AUTOR@odata.type": "#Collection(Microsoft.Azure.Search.V2016_09_01.QueryResultFacet)",
        "AUTOR": [
            {
                "count": 67,
                "value": "Wagner Crivelini"
            },
            {
                "count": 1,
                "value": "Wagner Crivelini & Paulo Roberto Elias"
            }
        ]
    },
    "@search.nextPageParameters": {
        "search": "*",
        "count": true,
        "queryType@odata.type": "#Microsoft.Azure.Search.V2016_09_01.QueryType",
        "queryType": "full",
        "select": "TITULO,TAGS",
        "filter": "MIDIA eq 'iMasters'",
        "orderby": "DATA desc",
        "facets@odata.type": "#Collection(String)",
        "facets": [
            "AUTOR"
        ],
        "skip": 50
    },
    "value": [
        {
            "@search.score": 1,
            "TITULO": "SQL Server: Auditando Dados com Tabelas Temporais",
            "TAGS": "Tabela Temporal"
        },
        {
            "@search.score": 1,
            "TITULO": "Introdução ao Luis - Parte 04: Aplicação em Produção",
            "TAGS": "LUIS"
        }, 
        ........................................................................
   ],
    "@odata.nextLink": "https://wcrivelini-test1.search.windows.net/indexes('publications')/docs/search.post.search?api-version=2016-09-01"
}

Comentários finais

A navegação e apresentação dos resultados de uma busca são elementos essenciais para o sucesso da sua aplicação. Portanto, dedique o tempo adequado para planejar sua aplicação e invista na simplicidade de uso e poder de pesquisa do Azure Search.

Este artigo traz exemplos elementares para os principais recursos de navegação e apresentação disponíveis neste serviço. Deixo a cargo do leitor a adaptação destes exemplos para caso mais complexos.

No sexto e último artigo da série, o tema é o uso do Azure Search para um novo tipo de aplicação: as buscas cognitivas, que usam recursos de aprendizado de máquina (Machine Learning) e linguagem natural (Natural Language Processing – NLP) para identificar conteúdo sobre dados desestruturados.

Leituras sugeridas