Formatar resultados de pesquisa ou modificar a composição de resultados de pesquisa na Pesquisa de IA do Azure
Este artigo explica a composição dos resultados da pesquisa e como moldar os resultados da pesquisa para se adequarem aos seus cenários. Os resultados da pesquisa são retornados em uma resposta de consulta. A forma de uma resposta é determinada por parâmetros na própria consulta. Estes parâmetros incluem:
- Número de correspondências encontradas no índice (
count
) - Número de correspondências retornadas na resposta (50 por padrão, configurável através
top
de ) ou por página (skip
etop
) - Uma pontuação de pesquisa para cada resultado, usada para classificação (
@search.score
) - Campos incluídos nos resultados da pesquisa (
select
) - Lógica de classificação (
orderby
) - Destaque de termos dentro de um resultado, combinando no termo total ou parcial no corpo
- Elementos opcionais do classificador semântico (
answers
no topo,captions
para cada partida)
Os resultados da pesquisa podem incluir campos de nível superior, mas a maioria da resposta consiste na correspondência de documentos em uma matriz.
Clientes e APIs para definir a resposta da consulta
Você pode usar os seguintes clientes para configurar uma resposta de consulta:
- Gerenciador de Pesquisa no portal do Azure, usando o modo de exibição JSON para que você possa especificar qualquer parâmetro suportado
- Documentos - POST (APIs REST)
- Método SearchClient.Search (SDK do Azure para .NET)
- Método SearchClient.Search (SDK do Azure para Python)
- Método SearchClient.Search (Azure para JavaScript)
- Método SearchClient.Search (Azure para Java)
Composição dos resultados
Os resultados são principalmente tabulares, compostos por campos de todos os retrievable
campos, ou limitados apenas aos campos especificados no select
parâmetro. As linhas são os documentos correspondentes, normalmente classificados por ordem de relevância, a menos que a lógica de consulta impeça a classificação de relevância.
Você pode escolher quais campos estão nos resultados da pesquisa. Embora um documento de pesquisa possa ter um grande número de campos, normalmente apenas alguns são necessários para representar cada documento nos resultados. Em uma solicitação de consulta, acrescente select=<field list>
para especificar quais retrievable
campos devem aparecer na resposta.
Escolha campos que ofereçam contraste e diferenciação entre documentos, fornecendo informações suficientes para convidar uma resposta de cliques por parte do usuário. Em um site de comércio eletrônico, pode ser um nome de produto, descrição, marca, cor, tamanho, preço e classificação. Para o índice de amostra de hotéis incorporado, podem ser os campos "select" no exemplo seguinte:
POST /indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "sandy beaches",
"select": "HotelId, HotelName, Description, Rating, Address/City",
"count": true
}
Dicas para resultados inesperados
Ocasionalmente, a saída da consulta não é o que você espera ver. Por exemplo, você pode achar que alguns resultados parecem ser duplicados ou um resultado que deve aparecer perto da parte superior está posicionado abaixo nos resultados. Quando os resultados da consulta são inesperados, você pode tentar estas modificações de consulta para ver se os resultados melhoram:
Altere
searchMode=any
(padrão) parasearchMode=all
exigir correspondências em todos os critérios em vez de qualquer um dos critérios. Isso é especialmente verdadeiro quando operadores booleanos são incluídos na consulta.Experimente diferentes analisadores lexicais ou analisadores personalizados para ver se isso altera o resultado da consulta. O analisador padrão quebra palavras hifenizadas e reduz palavras a formas raiz, o que geralmente melhora a robustez de uma resposta de consulta. No entanto, se você precisar preservar hífenes ou se as cadeias de caracteres incluírem caracteres especiais, talvez seja necessário configurar analisadores personalizados para garantir que o índice contenha tokens no formato correto. Para obter mais informações, consulte Pesquisa parcial de termos e padrões com caracteres especiais (hífenes, curinga, regex, padrões).
Contagem de jogos
O count
parâmetro retorna o número de documentos no índice que são considerados uma correspondência para a consulta. Para retornar a contagem, adicione count=true
à solicitação de consulta. Não há um valor máximo imposto pelo serviço de pesquisa. Dependendo da sua consulta e do conteúdo dos seus documentos, a contagem pode ser tão alta quanto todos os documentos do índice.
A contagem é precisa quando o índice é estável. Se o sistema estiver adicionando, atualizando ou excluindo documentos ativamente, a contagem será aproximada, excluindo todos os documentos que não estão totalmente indexados.
A contagem não será afetada pela manutenção de rotina ou outras cargas de trabalho no serviço de pesquisa. No entanto, se você tiver várias partições e uma única réplica, poderá experimentar flutuações de curto prazo na contagem de documentos (vários minutos) à medida que as partições são reiniciadas.
Gorjeta
Para verificar as operações de indexação, você pode confirmar se o índice contém o número esperado de documentos adicionando count=true
uma consulta de pesquisa search=*
vazia. O resultado é a contagem completa de documentos no seu índice.
Ao testar a sintaxe da consulta, count=true
você pode dizer rapidamente se suas modificações estão retornando resultados maiores ou menores, o que pode ser um feedback útil.
Número de resultados na resposta
O Azure AI Search usa a paginação do lado do servidor para impedir que as consultas recuperem muitos documentos ao mesmo tempo. Os parâmetros de consulta que determinam o número de resultados em uma resposta são top
e skip
. top
refere-se ao número de resultados de pesquisa numa página. skip
é um intervalo de , e informa ao mecanismo de pesquisa quantos resultados pular antes de top
obter o próximo conjunto.
O tamanho de página padrão é 50, enquanto o tamanho máximo de página é 1.000. Se você especificar um valor maior que 1.000 e houver mais de 1.000 resultados encontrados em seu índice, somente os primeiros 1.000 resultados serão retornados. Se o número de correspondências exceder o tamanho da página, a resposta incluirá informações para recuperar a próxima página de resultados. Por exemplo:
"@odata.nextLink": "https://contoso-search-eastus.search.windows.net/indexes/realestate-us-sample-index/docs/search?api-version=2024-07-01"
As principais correspondências são determinadas pela pontuação da pesquisa, assumindo que a consulta é pesquisa de texto completo ou semântica. Caso contrário, as principais correspondências são uma ordem arbitrária para consultas de correspondência exatas (onde uniforme @search.score=1.0
indica classificação arbitrária).
Definido top
para substituir o padrão de 50. Em APIs de visualização mais recentes, se você estiver usando uma consulta híbrida, poderá especificar maxTextRecallSize para retornar até 10.000 documentos.
Para controlar a paginação de todos os documentos retornados em um conjunto de resultados, use top
e skip
junto. Esta consulta devolve o primeiro conjunto de 15 documentos correspondentes mais uma contagem do total de correspondências.
POST https://contoso-search-eastus.search.windows.net/indexes/realestate-us-sample-index/docs/search?api-version=2024-07-01
{
"search": "condos with a view",
"count": true,
"top": 15,
"skip": 0
}
Esta consulta retorna o segundo conjunto, ignorando os primeiros 15 para obter os próximos 15 (16 a 30):
POST https://contoso-search-eastus.search.windows.net/indexes/realestate-us-sample-index/docs/search?api-version=2024-07-01
{
"search": "condos with a view",
"count": true,
"top": 15,
"skip": 15
}
Não é garantido que os resultados das consultas paginadas sejam estáveis se o índice subjacente estiver mudando. A paginação altera o valor de skip
cada página, mas cada consulta é independente e opera na exibição atual dos dados tal como existem no índice no momento da consulta (em outras palavras, não há cache ou instantâneo de resultados, como os encontrados em um banco de dados de uso geral).
A seguir está um exemplo de como você pode obter duplicatas. Suponha um índice com quatro documentos:
{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }
Agora suponha que você queira que os resultados retornem dois de cada vez, ordenados por classificação. Você executaria esta consulta para obter a primeira página de resultados: $top=2&$skip=0&$orderby=rating desc
, produzindo os seguintes resultados:
{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
No serviço, suponha que um quinto documento seja adicionado ao índice entre as chamadas de consulta: { "id": "5", "rating": 4 }
. Pouco tempo depois, você executa uma consulta para buscar a segunda página: $top=2&$skip=2&$orderby=rating desc
, e obtém estes resultados:
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
Observe que o documento 2 é buscado duas vezes. Isso ocorre porque o novo documento 5 tem um valor maior para classificação, então ele classifica antes do documento 2 e pousa na primeira página. Embora esse comportamento possa ser inesperado, é típico de como um mecanismo de pesquisa se comporta.
Paginação através de um grande número de resultados
Uma técnica alternativa para paginação é usar uma ordem de classificação e um filtro de intervalo como uma solução alternativa para skip
o .
Nesta solução alternativa, a classificação e o filtro são aplicados a um campo ID do documento ou a outro campo exclusivo para cada documento. O campo exclusivo deve ter filterable
e sortable
atribuição no índice de pesquisa.
Emita uma consulta para retornar uma página inteira de resultados classificados.
POST /indexes/good-books/docs/search?api-version=2024-07-01 { "search": "divine secrets", "top": 50, "orderby": "id asc" }
Escolha o último resultado retornado pela consulta de pesquisa. Um exemplo de resultado com apenas um valor de ID é mostrado aqui.
{ "id": "50" }
Use esse valor de ID em uma consulta de intervalo para buscar a próxima página de resultados. Este campo ID deve ter valores exclusivos, caso contrário, a paginação pode incluir resultados duplicados.
POST /indexes/good-books/docs/search?api-version=2024-07-01 { "search": "divine secrets", "top": 50, "orderby": "id asc", "filter": "id ge 50" }
A paginação termina quando a consulta retorna resultados zero.
Nota
Os filterable
atributos e sortable
só podem ser habilitados quando um campo é adicionado pela primeira vez a um índice, eles não podem ser habilitados em um campo existente.
Ordenar resultados
Numa consulta de pesquisa de texto completo, os resultados podem ser classificados por:
- uma pontuação de pesquisa
- uma pontuação de reclassificação semântica
- Uma ordem de classificação em um
sortable
campo
Você também pode impulsionar todas as partidas encontradas em campos específicos adicionando um perfil de pontuação.
Ordenar por pontuação de pesquisa
Para consultas de pesquisa de texto completo, os resultados são classificados automaticamente por uma pontuação de pesquisa usando um algoritmo BM25, calculado com base na frequência do termo, comprimento do documento e comprimento médio do documento.
O @search.score
intervalo é ilimitado ou 0 até (mas não incluindo) 1,00 em serviços mais antigos.
Para qualquer um dos algoritmos, um @search.score
igual a 1,00 indica um conjunto de resultados não pontuado ou não classificado, onde a pontuação de 1,0 é uniforme em todos os resultados. Os resultados não pontuados ocorrem quando o formulário de consulta é uma pesquisa difusa, consultas curinga ou regex ou uma pesquisa vazia (search=*
). Se você precisar impor uma estrutura de classificação sobre resultados não pontuados, considere uma orderby
expressão para alcançar esse objetivo.
Ordem pelo reclassificador semântico
Se você estiver usando o classificador semântico, o @search.rerankerScore
determina a ordem de classificação dos resultados.
O @search.rerankerScore
intervalo é de 1 a 4,00, onde uma pontuação mais alta indica uma correspondência semântica mais forte.
Encomendar com orderby
Se a ordenação consistente for um requisito do aplicativo, você poderá definir uma orderby
expressão em um campo. Somente os campos indexados como "classificáveis" podem ser usados para ordenar os resultados.
Os campos normalmente usados em um orderby
incluem classificação, data e local. A filtragem por local requer que a expressão de filtro chame a geo.distance()
função, além do nome do campo.
Os campos numéricos (Edm.Double
, Edm.Int32
, Edm.Int64
) são ordenados por ordem numérica (por exemplo, 1, 2, 10, 11, 20).
Os campos de cadeia de caracteres (Edm.String
, Edm.ComplexType
subcampos) são classificados em ordem de classificação ASCII ou ordem de classificação Unicode, dependendo do idioma.
O conteúdo numérico nos campos de cadeia de caracteres é ordenado alfabeticamente (1, 10, 11, 2, 20).
As cordas maiúsculas são classificadas à frente das minúsculas (APPLE, Apple, BANANA, Banana, apple, banana). Você pode atribuir um normalizador de texto para pré-processar o texto antes de classificar para alterar esse comportamento. Usar o tokenizador minúsculo em um campo não tem efeito no comportamento de classificação porque o Azure AI Search classifica em uma cópia não analisada do campo.
Cordas que conduzem com diacríticos aparecem por último (Äpfel, Öffnen, Üben)
Aumente a relevância usando um perfil de pontuação
Outra abordagem que promove a consistência da ordem é o uso de um perfil de pontuação personalizado. Os perfis de pontuação dão mais controle sobre a classificação dos itens nos resultados de pesquisa, com a capacidade de aumentar as correspondências encontradas em campos específicos. A lógica de pontuação extra pode ajudar a substituir pequenas diferenças entre réplicas porque as pontuações de pesquisa de cada documento estão mais distantes. Recomendamos o algoritmo de classificação para esta abordagem.
Detetor de ocorrências
O realce de cliques refere-se à formatação de texto (como realces em negrito ou amarelo) aplicada a termos correspondentes em um resultado, facilitando a identificação da correspondência. O realce é útil para campos de conteúdo mais longos, como um campo de descrição, onde a correspondência não é imediatamente óbvia.
Observe que o realce é aplicado a termos individuais. Não há capacidade de destaque para o conteúdo de um campo inteiro. Se quiser realçar uma frase, tem de fornecer os termos (ou frase) correspondentes numa cadeia de consulta entre aspas. Esta técnica é descrita mais adiante nesta seção.
As instruções de realce de cliques são fornecidas na solicitação de consulta. As consultas que acionam a expansão da consulta no mecanismo, como a pesquisa difusa e curinga, têm suporte limitado para realce de acertos.
Requisitos para realce de hit
- Os campos devem ser
Edm.String
ouCollection(Edm.String)
- Os campos devem ser atribuídos em
searchable
Especificar realce no pedido
Para retornar termos realçados, inclua o parâmetro highlight na solicitação de consulta. O parâmetro é definido como uma lista delimitada por vírgulas de campos.
Por padrão, a marcação de formato é <em>
, mas você pode substituir a tag usando highlightPreTag
e highlightPostTag
parâmetros. O código do cliente lida com a resposta (por exemplo, aplicando uma fonte em negrito ou um plano de fundo amarelo).
POST /indexes/good-books/docs/search?api-version=2024-07-01
{
"search": "divine secrets",
"highlight": "title, original_title",
"highlightPreTag": "<b>",
"highlightPostTag": "</b>"
}
Por padrão, o Azure AI Search retorna até cinco destaques por campo. Você pode ajustar esse número acrescentando um traço seguido de um inteiro. Por exemplo, "highlight": "description-10"
retorna até 10 termos realçados no conteúdo correspondente no campo de descrição.
Resultados em destaque
Quando o realce é adicionado à consulta, a resposta inclui um @search.highlights
para cada resultado para que o código do aplicativo possa direcionar essa estrutura. A lista de campos especificados para "destaque" é incluída na resposta.
Em uma pesquisa por palavra-chave, cada termo é verificado de forma independente. Uma consulta por "segredos divinos" retorna correspondências em qualquer documento que contenha qualquer um dos termos.
Realce da pesquisa por palavra-chave
Dentro de um campo realçado, a formatação é aplicada a termos inteiros. Por exemplo, em uma partida contra "Os Segredos Divinos da Irmandade Ya-Ya", a formatação é aplicada a cada termo separadamente, mesmo que eles sejam consecutivos.
"@odata.count": 39,
"value": [
{
"@search.score": 19.593246,
"@search.highlights": {
"original_title": [
"<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
],
"title": [
"<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
]
},
"original_title": "Divine Secrets of the Ya-Ya Sisterhood",
"title": "Divine Secrets of the Ya-Ya Sisterhood"
},
{
"@search.score": 12.779835,
"@search.highlights": {
"original_title": [
"<em>Divine</em> Madness"
],
"title": [
"<em>Divine</em> Madness (Cherub, #5)"
]
},
"original_title": "Divine Madness",
"title": "Divine Madness (Cherub, #5)"
},
{
"@search.score": 12.62534,
"@search.highlights": {
"original_title": [
"Grave <em>Secrets</em>"
],
"title": [
"Grave <em>Secrets</em> (Temperance Brennan, #5)"
]
},
"original_title": "Grave Secrets",
"title": "Grave Secrets (Temperance Brennan, #5)"
}
]
Realce da pesquisa de frases
A formatação de termo completo aplica-se mesmo numa pesquisa de frases, em que vários termos são colocados entre aspas duplas. O exemplo a seguir é a mesma consulta, exceto que "segredos divinos" é enviado como uma frase entre aspas (alguns clientes REST exigem que você escape das aspas interiores com uma barra \"
invertida):
POST /indexes/good-books/docs/search?api-version=2024-07-01
{
"search": "\"divine secrets\"",
"select": "title,original_title",
"highlight": "title",
"highlightPreTag": "<b>",
"highlightPostTag": "</b>",
"count": true
}
Como os critérios agora têm os dois termos, apenas uma correspondência é encontrada no índice de pesquisa. A resposta à consulta anterior tem esta aparência:
{
"@odata.count": 1,
"value": [
{
"@search.score": 19.593246,
"@search.highlights": {
"title": [
"<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
]
},
"original_title": "Divine Secrets of the Ya-Ya Sisterhood",
"title": "Divine Secrets of the Ya-Ya Sisterhood"
}
]
}
Destaque da frase em serviços mais antigos
Os serviços de pesquisa criados antes de 15 de julho de 2020 implementam uma experiência de realce diferente para consultas de frase.
Para os exemplos a seguir, suponha uma cadeia de caracteres de consulta que inclua a frase entre aspas "super bowl". Antes de julho de 2020, qualquer termo da frase é destacado:
"@search.highlights": {
"sentence": [
"The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
]
Para serviços de pesquisa criados após julho de 2020, apenas as frases que correspondem à consulta de frase completa são retornadas em @search.highlights
:
"@search.highlights": {
"sentence": [
"The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
]
Próximos passos
Para gerar rapidamente uma página de pesquisa para o seu cliente, considere estas opções:
Criar aplicativo de demonstração, no portal do Azure, cria uma página HTML com uma barra de pesquisa, navegação facetada e uma área de miniatura, se você tiver imagens.
Adicionar pesquisa a um aplicativo ASP.NET Core (MVC) é um tutorial e um exemplo de código que cria um cliente funcional.
Adicionar pesquisa a aplicativos Web é um tutorial em C# e um exemplo de código que usa as bibliotecas JavaScript do React para a experiência do usuário. O aplicativo é implantado usando os Aplicativos Web Estáticos do Azure e implementa paginação.