Normalização de texto para filtragem, facetamento e classificação sem diferenciação de maiúsculas e minúsculas

No Pesquisa de IA do Azure , 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". Em contraste com os campos "pesquisáveis" de texto completo que são emparelhados com analisadores de texto, o conteúdo criado para operações de classificação de faceta de filtro não passa por 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.

Aplicando um normalizador, você pode obter transformações de texto leve 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 ê para caracteres equivalentes ASCII "o" e "e"
  • Mapear caracteres como - e espaço em branco em um caractere especificado pelo usuário

Benefícios dos normalizadores

Pesquisar e recuperar documentos de um índice de pesquisa requer a correspondência da entrada da consulta com o 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, pequenas diferenças no conteúdo são avaliadas como valores distintamente diferentes. Considere os seguintes exemplos:

  • $filter=City eq 'Las Vegas' só retornará documentos que contenham o texto "Las Vegas" exato e excluam documentos com "LAS VEGAS" e "las vegas", o que é inadequado quando o caso de uso requer todos os documentos, independentemente da caixa.

  • 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 transformações leves que suavizam pequenas diferenças 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 é com letras minúsculas) para 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 "filterable", "sortable" ou "facetable" definidas como true. Definir um normalizador é opcional e é nulo por padrão. Recomendamos avaliar normalizadores predefinidos antes de configurar um personalizado.

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 normalizadores nos estágios iniciais de desenvolvimento ao descartar e recriar índices é rotineiro.

  1. 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"
       ...
     }
    ]
    
  2. Os normalizadores personalizados são definidos na seção "normalizadores" do índice primeiro e, em seguida, atribuídos à definição de campo, conforme mostrado na etapa anterior. Para obter 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, recompile o índice inteiramente (você não pode recompilar campos individuais).

Uma boa solução alternativa para índices de produção, em que a recompilação de índices é cara, é criar um novo campo idêntico ao antigo, mas com o novo normalizador, e usá-lo no lugar do antigo. Use Atualizar índice para incorporar o novo campo e mergeOrUpload para populá-lo. Posteriormente, como parte da manutenção planejada do índice, você pode limpar o índice para remover campos obsoletos.

Normalizadores predefinidos e personalizados

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

Categoria Descrição
Normalizadores predefinidos Fornecido pronto para uso e pode ser usado sem nenhuma configuração.
Normalizadores personalizados1 Para cenários avançados. Requer a configuração definida pelo usuário de uma combinação de elementos existentes, consistindo em filtros de caractere e token.

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

Testar um normalizador

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

Solicitação

  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
padrão Deixa em letras minúsculas o texto seguido por asciifolding.
em minúsculas Transforma caracteres em letras minúsculas.
maiúsculas Transforma caracteres em maiúsculas.
asciifolding Transforma caracteres que não estão no bloco Unicode Latino Básico para seu equivalente ASCII, se houver. Por exemplo, alterando à para a.
Elisão Remove a elisão do início dos tokens.

Filtros de caracteres suportados

Os normalizadores dão suporte a dois filtros de caracteres idênticos aos seus equivalentes em filtros de caracteres personalizados do analisador:

Filtros de token com suporte

A lista abaixo mostra os filtros de token com suporte para normalizadores e é um subconjunto dos filtros de token gerais 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 caractere e filtros de token. Os filtros de caractere e os filtros de token são os blocos de construção de um normalizador personalizado e responsáveis pelo processamento do texto. Esses filtros são aplicados da esquerda para a direita.

O token_filter_name_1 é o nome do filtro de token e char_filter_name_1char_filter_name_2 são os nomes dos filtros char (consulte os filtros de token com suporte e as tabelas de filtros de caractere com suporteabaixo para 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 posterior atualizando um existente. Adicionar um normalizador personalizado a um índice existente requer que o sinalizador "allowIndexDowntime" seja especificado no Índice de Atualização e fará com que o índice fique indisponível por alguns segundos.

Exemplo de normalizador personalizado

O exemplo a seguir ilustra uma definição de normalizador personalizado com filtros de caractere correspondentes e filtros de token. As opções personalizadas para filtros de caractere e filtros de token são especificadas separadamente como constructos nomeados e, em seguida, referenciadas na definição do normalizador, conforme ilustrado abaixo.

  • Um normalizador personalizado chamado "my_custom_normalizer" é definido na seção "normalizadores" da definição de í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 caractere "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
        }
     ]
  }

Consulte também