Normalização de texto para filtragem, facetamento e classificação sem diferenciação de maiúsculas e minúsculas
Importante
Esse recurso está em versão prévia pública nos Termos de Uso Complementares. A versão prévia da API REST dá suporte a esse recurso.
No Azure AI Search, um normalizador é um componente que pré-processa o texto para corresponder as palavras-chave com os campos marcados como "filtrante", "facetável" ou "classificável". Ao contrário dos campos "pesquisáveis" de texto completo, que são pareados com os analisadores de texto, o conteúdo criado para operações filter-facet-sort não é submetido à análise ou tokenização. A omissão da análise de texto pode produzir resultados inesperados quando as diferenças de maiúsculas e caracteres aparecem, e é por isso que você precisa de um normalizador para homogêneo de variações em seu conteúdo.
Ao aplicar um normalizador, você pode obter ligeiras transformações de texto que melhoram os resultados:
- Uso de maiúsculas consistente (como todas as letras minúsculas ou maiúsculas)
- Normalizar acentos e diacríticos como ö ou ê, transformando-os em seu equivalente ASCII, "o" e "e"
- Mapear caracteres como
-
e espaço em branco e substituí-los por um caractere especificado pelo usuário
Benefícios dos normalizadores
Para pesquisar e recuperar documentos de um índice de pesquisa, é preciso que a entrada de consulta corresponda ao conteúdo do documento. A correspondência é sobre o conteúdo tokenizado, como é o caso quando você invoca a "pesquisa", ou sobre o conteúdo não tokenizado, se a solicitação for uma operação de filtro, faceta ou orderby.
Como o conteúdo não tokenizado também não é analisado, as pequenas diferenças no conteúdo são avaliadas como valores nitidamente diferentes. Considere os seguintes exemplos:
$filter=City eq 'Las Vegas'
mostra apenas documentos que contenham exatamente o texto"Las Vegas"
e exclui aqueles com"LAS VEGAS"
e"las vegas"
, o que é inadequado quando o caso de uso requer todos os documentos independentemente do uso de maiúsculas ou minúsculas.search=*&facet=City,count:5
retornará"Las Vegas"
,"LAS VEGAS"
e"las vegas"
como valores distintos, apesar de ser a mesma cidade.search=usa&$orderby=City
retornará as cidades em ordem alfabética:"Las Vegas"
,"Seattle"
,"las vegas"
, mesmo que a intenção seja agrupar as mesmas cidades independentemente do uso de maiúsculas e minúsculas.
Um normalizador, que é invocado durante a indexação e a execução da consulta, adiciona ligeiras transformações que atenuam diferenças mínimas no texto para cenários de filtro, faceta e classificação. Nos exemplos anteriores, as variantes de "Las Vegas"
seriam processadas de acordo com o normalizador selecionado (por exemplo, todo o texto está em letra minúscula), para obter resultados mais uniformes.
Como especificar um normalizador
Os normalizadores são especificados em uma definição de índice, por campo, em campos de texto (Edm.String
e Collection(Edm.String)
) que têm pelo menos uma das propriedades "filtrável", "classificável" ou "facetável" definidas como true. A configuração de um normalizador é opcional e é nula por padrão. É recomendável avaliar os normalizadores predefinidos antes de configurar um personalizado.
Os normalizadores só podem ser especificados quando você adiciona um novo campo ao índice. Portanto, se possível, tente avaliar as necessidades de normalização antecipadamente e atribuir os normalizadores nos estágios iniciais de desenvolvimento, quando é comum descartar e recriar índices.
Ao criar uma definição de campo no índice, defina a propriedade "normalizador" como um dos seguintes valores: um normalizador predefinido, como "minúsculas", ou um normalizador personalizado (definido no mesmo esquema de índice).
"fields": [ { "name": "Description", "type": "Edm.String", "retrievable": true, "searchable": true, "filterable": true, "analyzer": "en.microsoft", "normalizer": "lowercase" ... } ]
Primeiro, os normalizadores personalizados são definidos na seção "normalizadores" do índice. Em seguida, são atribuídos à definição de campo, conforme mostrado na etapa anterior. Para saber mais, confira Criar Índice e também Adicionar Normalizadores Personalizados.
"fields": [ { "name": "Description", "type": "Edm.String", "retrievable": true, "searchable": true, "analyzer": null, "normalizer": "my_custom_normalizer" },
Observação
Para alterar o normalizador de um campo existente, recompile o índice todo (não é possível recompilar campos individuais).
Uma boa solução para índices de produção, em que a recriação deles é dispendiosa, é criar um campo novo idêntico ao antigo com o novo normalizador e usá-lo em seu lugar. Use Atualizar índice para incorporar o novo campo e mergeOrUpload para populá-lo. Posteriormente, como parte da manutenção planejada do índice, será possível limpar o índice para remover campos obsoletos.
Normalizadores predefinidos e personalizados
O Azure AI Search tem normalizadores integrados para os casos de uso mais comuns, além de permitir a personalização quando necessário.
Categoria | Descrição |
---|---|
Normalizadores predefinidos | Fornecidos de forma integrada e podem ser usados sem nenhuma configuração. |
Normalizadores personalizados 1 | Cenários avançados. Requer que o usuário defina uma combinação de elementos existentes, formada por filtros de caracteres e tokens. |
(1) Normalizadores personalizados não especificam criadores de token, pois sempre produzem apenas um.
Referência de normalizadores
Normalizadores predefinidos
Nome | Descrição e opções |
---|---|
padrão | Deixa em letras minúsculas o texto seguido por asciifolding. |
letras minúsculas | Transforma caracteres em letras minúsculas. |
letras maiúsculas | Transforma caracteres em letras maiúsculas. |
asciifolding | Transforma os caracteres que não estão no bloco Unicode latino básico em seu equivalente ASCII, se houver. Por exemplo, alterando à para a . |
elision | Remove a elisão do início dos tokens. |
Filtros de caracteres suportados
Os normalizadores são compatíveis com dois filtros de caracteres idênticos aos seus equivalentes em filtros de caracteres de analisador personalizado:
Filtros de token suportados
A lista a seguir mostra os filtros de token compatíveis com normalizadores e é um subconjunto dos filtros de token gerais usados nos analisadores personalizados.
- arabic_normalization
- asciifolding
- cjk_width
- elision
- german_normalization
- hindi_normalization
- indic_normalization
- persian_normalization
- scandinavian_normalization
- scandinavian_folding
- sorani_normalization
- lowercase
- uppercase
Adicionar normalizadores personalizados
Os normalizadores personalizados são definidos dentro do esquema de índice. A definição inclui nome, tipo, um ou mais filtros de caractere e filtros de token. Os filtros de caracteres e de token são os elementos básicos de um normalizador personalizado. Eles são responsáveis pelo processamento do texto e aplicados da esquerda para a direita.
token_filter_name_1
é o nome do filtro de token; char_filter_name_1
e char_filter_name_2
são nomes de filtros de caracteres (confira as tabelas de filtros de token compatíveis e filtros de caracteres compatíveisabaixo para ver os valores válidos).
"normalizers":(optional)[
{
"name":"name of normalizer",
"@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
"charFilters":[
"char_filter_name_1",
"char_filter_name_2"
],
"tokenFilters":[
"token_filter_name_1"
]
}
],
"charFilters":(optional)[
{
"name":"char_filter_name_1",
"@odata.type":"#char_filter_type",
"option1": "value1",
"option2": "value2",
...
}
],
"tokenFilters":(optional)[
{
"name":"token_filter_name_1",
"@odata.type":"#token_filter_type",
"option1": "value1",
"option2": "value2",
...
}
]
Os normalizadores personalizados podem ser adicionados durante a criação do índice ou depois atualizando um existente. Para adicionar um normalizador personalizado a um índice existente, é preciso especificar o sinalizador "allowIndexDowntime" em Atualizar índice, o que deixa o índice indisponível por alguns segundos.
Exemplo de normalizador personalizado
O exemplo a seguir ilustra uma definição de normalizador personalizado com filtros de caractere e de token correspondentes. Opções personalizadas para filtros de caracteres e de token são especificadas separadamente como constructos nomeados e, depois, referenciadas na definição do normalizador, como ilustrado abaixo.
Um normalizador personalizado, "my_custom_normalizer", é definido na seção "normalizadores" da definição do índice.
O normalizador é composto de dois filtros de caracteres e três filtros de token: elisão, letras minúsculas e filtro asciifolding personalizado "my_asciifolding".
O primeiro filtro de caracteres, "map_dash", substitui todos os hifens pelo caractere de sublinhado, enquanto o segundo, "remove_whitespace", remove todos os espaços.
{
"name":"myindex",
"fields":[
{
"name":"id",
"type":"Edm.String",
"key":true,
"searchable":false,
},
{
"name":"city",
"type":"Edm.String",
"filterable": true,
"facetable": true,
"normalizer": "my_custom_normalizer"
}
],
"normalizers":[
{
"name":"my_custom_normalizer",
"@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
"charFilters":[
"map_dash",
"remove_whitespace"
],
"tokenFilters":[
"my_asciifolding",
"elision",
"lowercase",
]
}
],
"charFilters":[
{
"name":"map_dash",
"@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
"mappings":["-=>_"]
},
{
"name":"remove_whitespace",
"@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
"mappings":["\\u0020=>"]
}
],
"tokenFilters":[
{
"name":"my_asciifolding",
"@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
"preserveOriginal":true
}
]
}