Normalização de texto para filtragem, facetagem e ordenação insensíveis a maiúsculas e minúsculas

Em Pesquisa de IA do Azure, um normalizador é um componente que pré-processa o texto para correspondência de palavras-chave em campos marcados como "filtrável", "facetable" ou "sortable". Em contraste com os campos "pesquisáveis" em texto completo que são emparelhados com analisadores de texto, o conteúdo criado para operações de filtragem e ordenação de facetas não é alvo de análise ou tokenização. A omissão da análise de texto pode levar a resultados inesperados quando surgem diferenças de maiúsculas e de caracteres: por isso é necessário um normalizador para homogeneizar as variações no seu conteúdo.

Ao aplicar um normalizador, pode obter transformações de texto leve que melhoram os resultados:

  • Maiúscula consistente (como todas minúsculas ou maiúsculas)
  • Normalize acentos e diacríticos como ö ou ê para caracteres equivalentes ASCII "o" e "e"
  • Mapear caracteres como - e espaços em branco para um carácter especificado pelo utilizador.

Benefícios dos normalizadores

Pesquisar e recuperar documentos de um índice de pesquisa requer que a entrada da consulta corresponda ao conteúdo do documento. A correspondência ocorre sobre conteúdo tokenizado, como acontece quando invoca "pesquisa", ou sobre conteúdo não tokenizado se o pedido for uma operação de filtro, faceta ou orderby .

Como o conteúdo não tokenizado também não é analisado, pequenas diferenças no conteúdo são avaliadas como valores claramente distintos. Considere os seguintes exemplos:

  • $filter=City eq 'Las Vegas' Só devolve documentos que contenham o texto "Las Vegas" exato e exclui documentos com "LAS VEGAS" e "las vegas", o que é inadequado quando o caso de uso exige todos os documentos, independentemente do caso.

  • search=*&facet=City,count:5 Vai regressar "Las Vegas", "LAS VEGAS" e "las vegas" como valores distintos apesar de serem a mesma cidade.

  • search=usa&$orderby=City devolverá as cidades por ordem lexicográfica: "Las Vegas", "Seattle", "las vegas", mesmo que a intenção seja ordenar as mesmas cidades juntas, independentemente do caso.

Um normalizador, que é invocado durante a indexação e execução da consulta, adiciona transformações leves que suavizam pequenas diferenças de texto para cenários de filtro, faceta e ordenação. Nos exemplos anteriores, as variantes de "Las Vegas" seriam processadas de acordo com o normalizador selecionado (por exemplo, todo o texto está em minúsculas) para resultados mais uniformes.

Como especificar um normalizador

Os normalizadores são especificados numa definição de índice, por campo, em campos de texto (Edm.String e Collection(Edm.String)) que tenham pelo menos uma das propriedades "filtrável", "ordenável" ou "facetable" definidas como verdadeiras. Definir um normalizador é opcional e é nulo por defeito. Recomendamos avaliar normalizadores pré-definidos antes de configurar um personalizado.

Normalizadores só podem ser especificados quando se adiciona um novo campo ao índice, por isso, se possível, tente avaliar as necessidades de normalização desde o início e atribua normalizadores nas fases iniciais de desenvolvimento, quando eliminar e recriar índices for rotina.

  1. Ao criar uma definição de campo no índice, defina a propriedade "normalizador" para um dos seguintes valores: um normalizador pré-definido como "minúscula", 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"
       ...
     }
    ]
    
  2. Normalizadores personalizados são definidos primeiro na secção "normalizadores" do índice e depois atribuídos à definição do campo conforme mostrado no passo anterior. Para mais informações, consulte Criar Índice e também Adicionar normalizadores personalizados.

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "normalizer": "my_custom_normalizer"
     },
    

Nota

Para alterar o normalizador de um campo existente, reconstrua completamente o índice (não pode reconstruir campos individuais).

Uma boa solução alternativa para índices de produção, onde reconstruir índices é dispendioso, é criar um campo novo idêntico ao antigo mas com o novo normalizador, e usá-lo no lugar do antigo. Use Update Index para incorporar o novo campo e mergeOrUpload para preenchê-lo. Mais tarde, como parte da manutenção planeada do índice, pode limpar o índice para remover campos obsoletos.

Normalizadores pré-definidos e personalizados

O Pesquisa de IA do Azure fornece normalizadores incorporados para casos de uso comuns, juntamente com a capacidade de personalizar conforme necessário.

Categoria Descrição
Normalizadores predefinidos Fornecido de fábrica e pode ser usado sem qualquer configuração.
Normalizadores personalizados1 Para cenários avançados. Requer a configuração definida pelo utilizador de uma combinação de elementos existentes, consistindo em filtros de char e token.

(1) Normalizadores personalizados não especificam tokenizadores, uma vez que os normalizadores produzem sempre um único token.

Testar um normalizador

Pode usar o Analisador de Teste (REST) para ver como um normalizador processa uma entrada.

Pedido

  POST https://[search service name].search.windows.net/indexes/[index name]/analyze?api-version=[api-version]
    Content-Type: application/json
    api-key: [admin key]

  {
     "normalizer":"asciifolding",
     "text": "Vis-à-vis means Opposite"
  }

Resposta

HTTP/1.1 200 OK

{
  "tokens": [
    {
      "token": "Vis-a-vis means Opposite",
      "startOffset": 0,
      "endOffset": 24,
      "position": 0
    }
  ]
}

Referência de normalizadores

Normalizadores predefinidos

Nome Descrição e Opções
norma Coloca o texto em minúsculas, seguido por asciifolding.
em minúsculas Transforma os caracteres em minúsculas.
em maiúscula(s) Transforma os caracteres em maiúsculas.
asciifolding Transforma caracteres que não estão no bloco Unicode Latino Básico para o seu equivalente ASCII, caso exista. Por exemplo, mudando à para a.
elisão Remova a elisão do início dos tokens.

Filtros de caracteres suportados

Os normalizadores suportam dois filtros de caracteres que são idênticos aos seus equivalentes em filtros de caracteres de analisadores personalizados:

Filtros de tokens suportados

A lista abaixo mostra os filtros de tokens suportados para normalizadores e é um subconjunto dos filtros globais de tokens usados em analisadores personalizados.

Adicionar normalizadores personalizados

Normalizadores personalizados são definidos dentro do esquema de índice. A definição inclui um nome, um tipo, um ou mais filtros de caracteres e filtros de token. Os filtros de caracteres e os filtros de token são os blocos de construção de um normalizador personalizado e responsáveis pelo processamento do texto. Estes filtros são aplicados da esquerda para a direita.

O token_filter_name_1 é o nome do filtro de token, e char_filter_name_1 e char_filter_name_2 são os nomes dos filtros de caracteres (ver tabelas abaixo dos filtros de tokens suportados e dos filtros de caracteres suportadospara 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",
      ...
   }
]

Normalizadores personalizados podem ser adicionados durante a criação do índice ou mais tarde, atualizando um já existente. Adicionar um normalizador personalizado a um índice existente requer que o sinalizador "allowIndexDowntime" seja especificado no Update Index e fará com que o índice fique indisponível durante alguns segundos.

Exemplo de normalizador personalizado

O exemplo abaixo ilustra uma definição personalizada de normalizador com filtros de caracteres e filtros de token correspondentes. Opções personalizadas para filtros de caracteres e filtros de token são especificadas separadamente como construções nomeadas, e depois referenciadas na definição do normalizador, como ilustrado abaixo.

  • Um normalizador personalizado chamado "my_custom_normalizer" é definido na secção "normalizadores" da definição do índice.

  • O normalizador é composto por dois filtros de caracteres e três filtros de token: elisão, minúsculas e filtro personalizado de asciifolding "my_asciifolding".

  • O primeiro filtro de caracteres, "map_dash", substitui todos os traços por sublinhados, 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
        }
     ]
  }

Ver também