Compartilhar via


Adicionar navegação facetada aos resultados da pesquisa

A navegação facetada é usada para filtragem autodirecionada em resultados de consulta em um aplicativo de pesquisa, em que seu aplicativo oferece controles de formulário para pesquisa de escopo para grupos de documentos (por exemplo, categorias ou marcas), e o Azure AI Search fornece as estruturas de dados e filtros para apoiar a experiência.

Neste artigo, conheça as etapas para retornar uma estrutura de navegação facetada no Azure AI Search. Quando estiver familiarizado com conceitos e clientes básicos, prossiga para exemplos de Faceta para sintaxe sobre vários casos de uso, incluindo facetas básicas e contagens distintas.

Mais recursos de faceta estão disponíveis por meio de APIs de visualização:

  • estruturas de faceta hierárquica
  • filtragem de faceta
  • agregações de faceta

Os exemplos de navegação de faceta fornecem a sintaxe e o uso das versões prévias dos recursos.

Navegação facetada em uma página de busca

As facetas são dinâmicas porque se baseiam em cada conjunto de resultados de consulta específico. Uma resposta de pesquisa traz consigo todos os buckets de faceta usados para navegar pelos documentos no resultado. A consulta é executada primeiro e, em seguida, as facetas são extraídas dos resultados atuais e reunidas em uma estrutura de navegação facetada.

No Azure AI Search, as facetas são de uma camada só e não podem ser hierárquicas, a menos que você use a API de pré-visualização. Se você não estiver familiarizado com estruturas de navegação facetada, o exemplo a seguir mostra uma à esquerda. As contagens indicam o número de correspondências para cada faceta. O mesmo documento pode ser representado em várias facetas.

Captura de tela dos resultados da pesquisa por facetas.

As facetas podem ajudar a encontrar o que você está procurando, garantindo que você não obterá zero resultados. Como desenvolvedor, facetas permitem que você exponha os critérios de pesquisa mais úteis para navegar pelo seu índice de busca.

Navegação facetada no código

As facetas são habilitadas em campos com suporte em um índice e especificadas em uma consulta. A estrutura de navegação facetada é retornada no início da resposta, seguida pelos resultados.

O exemplo REST a seguir é uma consulta vazia ("search": "*") com escopo para todo o índice (consulte a amostra de hotéis integrada). O facets parâmetro especifica o campo "Categoria".

POST https://{{service_name}}.search.windows.net/indexes/hotels/docs/search?api-version={{api_version}}
{
    "search": "*",
    "queryType": "simple",
    "select": "",
    "searchFields": "",
    "filter": "",
    "facets": [ "Category"], 
    "orderby": "",
    "count": true
}

A resposta no exemplo começa com a estrutura de navegação por facetas. A estrutura consiste em valores de "Categoria" e uma contagem de hotéis para cada categoria. É seguido pelos demais resultados de pesquisa, sendo truncado aqui para apenas um documento por questão de brevidade. Este exemplo funciona bem por vários motivos. O número de facetas para esse campo está abaixo do limite (o padrão é 10) para que todos elas apareçam e todos os hotéis no índice de 50 hotéis são representados em exatamente uma dessas categorias.

{
    "@odata.context": "https://demo-search-svc.search.windows.net/indexes('hotels')/$metadata#docs(*)",
    "@odata.count": 50,
    "@search.facets": {
        "Category": [
            {
                "count": 13,
                "value": "Budget"
            },
            {
                "count": 12,
                "value": "Resort and Spa"
            },
            {
                "count": 9,
                "value": "Luxury"
            },
            {
                "count": 7,
                "value": "Boutique"
            },
            {
                "count": 5,
                "value": "Suite"
            },
            {
                "count": 4,
                "value": "Extended-Stay"
            }
        ]
    },
    "value": [
        {
            "@search.score": 1.0,
            "HotelId": "1",
            "HotelName": "Stay-Kay City Hotel",
            "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
            "Category": "Boutique",
            "Tags": [
                "pool",
                "air conditioning",
                "concierge"
            ],
            "ParkingIncluded": false,
        },
        . . . 
    ]
}

Habilitar facetas em campos

Você pode adicionar facetas a novos campos que contêm texto sem formatação ou conteúdo numérico. Os tipos de dados com suporte incluem cadeias de caracteres, datas, campos boolianos e campos numéricos (mas não vetores).

Você pode usar o portal do Azure, as APIs REST, os SDKs do Azure ou qualquer método que dê suporte à criação ou atualização de esquemas de índice no Azure AI Search. Como primeira etapa, identifique quais campos serão usados para facetas.

Escolher quais campos atribuir

As facetas podem ser calculadas em campos e coleções de valor único. Os campos que funcionam melhor na navegação facetada têm estas características:

  • Conteúdo legível (não vetor) humano.
  • Baixa cardinalidade (alguns valores distintos que se repetem em documentos do seu corpus de pesquisa).
  • Valores descritivos curtos (uma ou duas palavras) que aparecem de forma clara em uma árvore de navegação.

Os valores dentro de um campo, e não o nome do campo em si, produzem as facetas em uma estrutura de navegação facetada. Se a faceta for um campo de cadeia de caracteres chamado Cor, as facetas serão azuis, verdes e qualquer outro valor para esse campo. Revise os valores de campo para assegurar que não haja erros de digitação, nulos ou diferenças de maiúsculas e minúsculas. Considere atribuir um normalizador a um campo filtrante e facetável para suavizar pequenas variações no texto. Por exemplo, "Canadá", "CANADÁ" e "canadá" seriam normalizados em um bucket.

Evitar campos sem suporte

Você não pode definir facetas em campos existentes, em campos de vetor ou campos do tipo Edm.GeographyPoint ou Collection(Edm.GeographyPoint).

Em coleções de campos complexas, "facetável" deve ser nulo.

Começar com novas definições de campo

Atributos que afetam como um campo é indexado só podem ser definidos quando os campos são criados. Essa restrição se aplica a facetas e filtros.

Se o índice já existir, você poderá adicionar uma nova definição de campo que forneça facetas. Os documentos existentes no índice obtêm um valor nulo para o novo campo. Esse valor nulo será substituído na próxima vez que você atualizar o índice.

  1. Na página de serviços de pesquisa do portal do Azure, vá para a guia Campos do índice e selecione Adicionar campo.

  2. Forneça um nome, um tipo de dados e atributos. Recomendamos adicionar filtrável porque é comum definir filtros com base em um bucket de faceta na resposta. Recomendamos a opção de classificação porque os filtros produzem resultados não ordenados, e talvez seja necessário ordená-los em seu aplicativo.

    Você também pode definir o campo como pesquisável, caso deseje habilitar a pesquisa de texto completo, e como recuperável, se quiser incluir o campo na resposta de pesquisa.

    Captura de tela da página Adicionar campos no portal do Azure.

  3. Salve a definição de campo.

Retornar facetas em uma consulta

Lembre-se de que as facetas são calculadas dinamicamente de resultados em uma resposta de consulta. Você só obtém facetas para documentos encontrados pela consulta atual.

Use a exibição JSON no Gerenciador de Pesquisa para definir parâmetros de faceta no portal do Azure.

  1. Selecione um índice e abra o Gerenciador de Pesquisa no Modo de Exibição JSON.
  2. Forneça uma consulta no JSON. Você pode digitá-lo, copiar o JSON de um exemplo REST ou usar o intellisense para ajudar com a sintaxe. Consulte o exemplo REST na próxima aba para referência sobre expressões de facetas.
  3. Selecione Pesquisar para retornar resultados facetados, articulados em JSON.

Aqui está uma captura de tela do exemplo de consulta de faceta básica no índice de exemplo de hotéis. Você pode colar em outros exemplos neste artigo para retornar os resultados no Gerenciador de Pesquisa.

Captura de tela da página Gerenciador de Pesquisa no portal do Azure.

Práticas recomendadas para trabalhar com facetas

Esta seção é uma coleção de dicas e soluções alternativas que são úteis para o desenvolvimento de aplicativos.

Recomendamos o C#: adicionar pesquisa a aplicativos Web para obter um exemplo de navegação facetada que inclua código para a camada de apresentação. O exemplo também inclui filtros, sugestões e preenchimento automático. Ele usa JavaScript e React para a camada de apresentação.

Inicializar uma estrutura de navegação facetada com uma cadeia de caracteres de pesquisa não qualificada ou vazia

É útil inicializar uma página de pesquisa com uma consulta aberta ("search": "*") para preencher completamente a estrutura de navegação facetada. Assim que você passa os termos de consulta na solicitação, a estrutura de navegação facetada tem como escopo apenas as correspondências nos resultados, em vez de todo o índice. Essa prática é útil para verificar comportamentos de faceta e filtro durante o teste. Se você incluir critérios de correspondência na consulta, a resposta excluirá documentos que não corresponderem, o que tem o potencial efeito downstream de exclusão de facetas.

Limpar facetas

Ao projetar a experiência do usuário, lembre-se de adicionar um mecanismo para limpar facetas. Uma prática comum para limpar facetas é emitir uma consulta aberta para redefinir a página.

Desabilitar o faceteamento para economizar armazenamento e melhorar o desempenho

Para otimização de desempenho e armazenamento, defina "facetable": false para campos que nunca devem ser usados como faceta. Os exemplos incluem campos de cadeia de caracteres para valores exclusivos, como uma ID ou um nome de produto, para evitar seu uso acidental (e ineficaz) na navegação facetada. Essa prática recomendada é especialmente importante para a API REST, que permite filtros e facetas em campos de cadeia de caracteres por padrão.

Lembre-se de que você não pode usar Edm.GeographyPoint ou Collection(Edm.GeographyPoint) campos na navegação facetada. Lembre-se de que as facetas funcionam melhor em campos com baixa cardinalidade. Devido à resolução de coordenadas geográficas, é raro que dois conjuntos de coordenadas sejam iguais em um determinado conjunto de dados. Dessa maneira, as facetas não têm suporte para coordenadas geográficas. Você deve usar um campo de cidade ou região para facetar por localização.

Verificar se há dados incorretos

Ao preparar dados para indexação, verifique os campos para valores nulos, erros ortográficos ou discrepâncias de maiúsculas e minúsculas e versões simples e plural da mesma palavra. Por padrão, filtros e facetas não passam por análise lexical ou verificação ortográfica, o que significa que todos os valores de um campo "facetable" são facetas potenciais, mesmo que as palavras sejam diferentes por um caractere.

Normalizadores podem mitigar discrepâncias de dados, corrigindo diferenças de maiúsculas e caracteres. Caso contrário, para inspecionar seus dados, você pode verificar campos na origem ou executar consultas que retornam valores do índice.

Um índice não é o melhor lugar para corrigir valores nulos ou inválidos. Você deve corrigir problemas de dados em sua origem, supondo que seja um banco de dados ou armazenamento persistente ou em uma etapa de limpeza de dados executada antes da indexação.

Ordenando buckets de faceta

Embora você possa classificar dentro de um bucket, não há parâmetros para controlar a ordem dos buckets de faceta na estrutura de navegação como um todo. Se você quiser buckets de faceta em uma ordem específica, deverá fornecê-la no código do aplicativo.

Discrepâncias em contagens de faceta

Em determinadas circunstâncias, você pode constatar que as contagens de facetas não são totalmente precisas, devido à arquitetura de fragmentação. Cada índice de pesquisa é distribuído em vários fragmentos, e cada fragmento informa as N principais facetas por número de documentos, que são então combinadas em um único resultado. Como são apenas as N principais facetas para cada fragmento, é possível perder ou contar menos documentos correspondentes na resposta de facetas.

Para garantir a precisão, você pode ampliar artificialmente a contagem: <número> para um número maior, para forçar relatórios completos em cada fragmento. Você pode especificar "count": "0" para facetas ilimitadas. Ou você pode definir a "contagem" como um valor maior ou igual ao número de valores exclusivos do campo facetado. Por exemplo, se você estiver facetando em um campo "tamanho" com cinco valores exclusivos, pode definir "count:5" para garantir que todas as correspondências sejam representadas na resposta de facetas.

A desvantagem dessa solução alternativa é aumentar a latência da consulta, portanto, use-a somente quando necessário.

Preservar uma estrutura de navegação por faceta de maneira assíncrona dos resultados filtrados

No Azure AI Search, existem facetas somente para resultados atuais. No entanto, é um requisito comum do aplicativo manter um conjunto estático de facetas para que o usuário possa navegar no sentido inverso, refazendo passos para explorar caminhos alternativos por meio do conteúdo de pesquisa.

Se você quiser um conjunto estático de facetas junto com uma experiência de drilldown dinâmica, poderá implementá-la usando duas consultas filtradas: uma com escopo para os resultados, outra usada para criar uma lista estática de facetas para fins de navegação.

Deslocamento de grandes contagens de facetas por meio de filtros

Os resultados da pesquisa e os resultados de facetas que são muito grandes podem ser reduzidos ao adicionar filtros. No exemplo a seguir, na consulta para computação em nuvem, 254 itens têm especificação interna como um tipo de conteúdo. Se os resultados forem muito grandes, a adição de filtros poderá ajudar os usuários a refinar a consulta adicionando mais critérios.

Os itens não são mutuamente exclusivos. Se um item atende aos critérios de ambos os filtros, ele será contado em cada um deles. Essa duplicação é possível ao realizar a facetação em campos Collection(Edm.String), que são frequentemente usados para implementar a marcação de documentos.

Search term: "cloud computing"
Content type
   Internal specification (254)
   Video (10)

Próximas etapas