Normalización de texto para filtrado, aplicación de facetas y ordenación sin distinción de mayúsculas y minúsculas

Importante

Esta característica se encuentra en versión preliminar pública en los Términos de uso complementarios. La API REST de versión preliminar admite esta característica.

En Azure AI Search, un normalizador es un componente que preprocesa texto para la coincidencia de palabras clave en campos marcados como "filterable", "facetable" o "sortable". A diferencia de los campos "searchable" de texto completo, que se emparejan con analizadores de texto, el contenido creado para las operaciones de ordenación de faceta de filtro no se somete a análisis ni tokenización. La omisión del análisis de texto puede producir resultados inesperados cuando se muestran las diferencias de mayúsculas y minúsculas, por lo que se necesita un normalizador para homogeneizar las variaciones en el contenido.

Al aplicar un normalizador, puede lograr ligeras transformaciones de texto que mejoran los resultados:

  • Mayúsculas y minúsculas coherentes (como el uso de todo en mayúsculas o todo en minúsculas)
  • Normalización de acentos y signos diacríticos como "ö" o "ê" a los caracteres ASCII equivalentes "o" y "e", respectivamente.
  • Asignación de caracteres como - y el espacio en blanco a un carácter especificado por el usuario.

Ventajas de los normalizadores

Para buscar y recuperar documentos de un índice de búsqueda, es necesario que la entrada de la consulta coincida con el contenido del documento. La coincidencia se realiza sobre contenido tokenizado, como sucede cuando se invoca "search" o sobre contenido no tokenizado si la solicitud es una operación filter, facet u orderby.

Dado que el contenido no tokenizado tampoco se analiza, las pequeñas diferencias en el contenido se evalúan como valores distintos. Considere los siguientes ejemplos:

  • $filter=City eq 'Las Vegas' solo devolverá documentos que contengan el texto "Las Vegas" exacto y excluyan los documentos con "LAS VEGAS" y "las vegas", que es inadecuado cuando el caso de uso requiere todos los documentos independientemente del uso.

  • search=*&facet=City,count:5 devolverá "Las Vegas", "LAS VEGAS" y "las vegas" como valores distintos a pesar de ser la misma ciudad.

  • search=usa&$orderby=City devolverá las ciudades en orden lexicográfico: "Las Vegas", "Seattle", "las vegas", incluso si la intención es ordenar las mismas ciudades juntas independientemente del caso.

Un normalizador, que se invoca durante la indexación y la ejecución de consultas, agrega transformaciones ligeras que suavizan las pequeñas diferencias en el texto para escenarios de filtro, faceta y ordenación. En los ejemplos anteriores, las variantes de "Las Vegas" se procesarían según el normalizador seleccionado (por ejemplo, todo el texto está en minúsculas) para obtener resultados más uniformes.

Cómo especificar un normalizador

Los normalizadores se especifican en una definición de índice, según el campo, en campos de texto (Edm.Stringy Collection(Edm.String)) que tienen al menos una de las propiedades "filtrables", "ordenables" o "clasificables" establecidas en "true". Establecer un normalizador es opcional y es null de forma predeterminada. Se recomienda evaluar los normalizadores predefinidos antes de configurar uno personalizado.

Los normalizadores solo se pueden especificar al agregar un nuevo campo al índice, por lo que, si es posible, intente evaluar las necesidades iniciales de normalización y asignar normalizadores en las fases iniciales de desarrollo al quitar y volver a crear índices es rutinario.

  1. Cuando cree una definición de campo en el índice, establezca la propiedad "normalizer" en uno de los siguientes valores: un normalizador predefinido (por ejemplo, "lowercase"), o un normalizador personalizado (que se defina en el mismo esquema del índice).

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. Los normalizadores personalizados deben definirse en primer lugar en la sección "normalizers" del índice y, a continuación, deben asignarse a la definición de campo tal como se muestra en el paso anterior. Para más información, consulte Creación de un índice y también Incorporación de normalizadores personalizados.

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

Nota:

Para cambiar el normalizador de un campo existente, vuelva a generar el índice por completo (no se pueden volver a generar campos individuales).

Una buena solución alternativa para los índices de producción, en los que volver a generar índices es costoso, consiste en crear un nuevo campo idéntico al anterior pero con el nuevo normalizador, y usarlo en lugar del antiguo. Use Update Index para incorporar el nuevo campo y mergeOrUpload para rellenarlo. Más adelante, como parte de un mantenimiento planeado del índice, puede limpiarlo para quitar campos obsoletos.

Normalizadores predefinidos y personalizados

Azure AI Search proporciona normalizadores integrados para casos de uso común, junto con la capacidad de personalizarlos según sea necesario.

Category Descripción
Normalizadores predefinidos Están integrados y se pueden usar sin realizar ninguna configuración.
Normalizadores personalizados1 Para los escenarios avanzados. Requieren que el usuario defina una configuración para una combinación de elementos existentes, que consta de filtros de carácter y de token.

(1) Los normalizadores personalizados no especifican divisores en tokens, ya que los normalizadores siempre generan un token único.

Referencia de normalizadores

Normalizadores predefinidos

Nombre Descripción y opciones
Estándar Escribe en minúsculas el texto y pliega el código ASCII.
minúsculas Transforma los caracteres a minúsculas.
mayúsculas Transforma los caracteres a mayúsculas.
asciifolding Transforma los caracteres que no están en el bloque Unicode de caracteres latinos básicos en su equivalente ASCII, si existe alguno. Por ejemplo, cambie à a a.
elision Quita la elisión del principio de los tokens.

Filtros de caracteres compatibles

Los normalizadores admiten dos filtros de caracteres idénticos a sus homólogos en los filtros de caracteres del analizador personalizado:

Filtros de tokens compatibles

La siguiente lista muestra los filtros de token compatibles con los normalizadores y un subconjunto de los filtros de token generales que se usan en los analizadores personalizados.

Incorporación de normalizadores personalizados

Los normalizadores personalizados se definen en el esquema de índice. La definición incluye un nombre, un tipo, uno o varios filtros de carácter y filtros de token. Los filtros de carácter y los filtros de token son los bloques de creación de un normalizador personalizado y se encargan del procesamiento del texto. Estos filtros se aplican de izquierda a derecha.

token_filter_name_1 es el nombre de un filtro de token, char_filter_name_1 y char_filter_name_2 son los nombres de los filtros de caracteres (consulte las tablas Filtros de token compatibles y Filtros de caracteres compatibles a continuación para ver los 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",
      ...
   }
]

Los normalizadores personalizados se pueden agregar durante la creación del índice o posteriormente al actualizar uno existente. Para agregar un normalizador personalizado a un índice existente se debe especificar la marca "allowIndexDowntime" en Actualizar índice y el índice no estará disponible durante unos segundos.

Ejemplo de normalizador personalizado

En el ejemplo siguiente se muestra una definición de normalizador personalizado con los filtros de caracteres y de token correspondientes. Las opciones personalizadas de los filtros de caracteres y de tokens se especifican por separado como construcciones con nombre y, a continuación, se hace referencia a ellas en la definición del normalizador, tal como se muestra a continuación.

  • Se define un normalizador personalizado denominado "my_custom_normalizer" en la sección "normalizers" de la definición del índice.

  • El normalizador se compone de dos filtros de carácter y tres filtros de token: elisión, minúsculas y filtro de plegado de ASCII personalizado "my_asciifolding".

  • El primer filtro de caracteres "map_dash" reemplaza todos los guiones por caracteres de subrayado, mientras que el segundo, "remove_whitespace", quita todos los espacios.

  {
     "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 también