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

En Búsqueda de Azure AI, 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 "buscables" 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 transformaciones de texto claro que mejoran los resultados:

  • Mayúsculas y minúsculas coherentes (como el uso de todo en mayúsculas o todo en minúsculas)
  • Normalizar acentos y diacríticos como ö o ê a caracteres equivalentes ASCII "o" y "e"
  • Asignar caracteres como - y espacios en blanco a un carácter especificado por el usuario

Ventajas de los normalizadores

La búsqueda y recuperación de documentos de un índice de búsqueda requiere la coincidencia de la entrada de consulta 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. Tenga en cuenta los ejemplos siguientes:

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

  • 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 de 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, por campo, en campos de texto (Edm.String y Collection(Edm.String)) que tienen al menos una de las propiedades "filtrables", "ordenable" o "facetable" 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. Al crear una definición de campo en el índice, establezca la propiedad "normalizer" en uno de los valores siguientes: un normalizador predefinido como "minúscula" o un normalizador personalizado (definido en el mismo esquema de índice).

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. Los normalizadores personalizados se definen en la sección "normalizadores" del índice primero y, a continuación, se asignan a la definición de campo, como se muestra en el paso anterior. Para obtener más información, vea Crear índice y agregar 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, donde la regeneración de índices es costosa, es crear un nuevo campo idéntico al anterior, pero con el nuevo normalizador, y usarlo en lugar del anterior. Use Update Index para incorporar el nuevo campo y mergeOrUpload para rellenarlo. Más adelante, como parte del mantenimiento planeado de índices, puede limpiar el índice para quitar campos obsoletos.

Normalizadores predefinidos y personalizados

Búsqueda de Azure AI proporciona normalizadores integrados para casos de uso comunes junto con la capacidad de personalizar según sea necesario.

Categoría Descripción
Normalizadores predefinidos Se proporciona de fábrica y se puede usar sin ninguna configuración.
Normalizadores personalizados1 Para escenarios avanzados. Requiere la configuración definida por el usuario de una combinación de elementos existentes, que consta de filtros char y token.

(1) Los normalizadores personalizados no especifican tokenizadores, ya que los normalizadores siempre producen un único token.

Prueba de un normalizador

Puede usar el Analizador de pruebas (REST) para ver cómo un normalizador procesa una entrada.

Solicitud

  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"
  }

Respuesta

HTTP/1.1 200 OK

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

Normalizadores: Referencia

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 en minúsculas.
mayúsculas Transforma los caracteres en mayúsculas.
asciifolding Transforma los caracteres que no están en el bloque Unicode latino básico en su equivalente ASCII, si existe uno. Por ejemplo, cambie à a a.
elisión Quita la elisión del principio de los tokens.

Filtros de caracteres admitidos

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

Filtros de token admitidos

En la lista siguiente se muestran los filtros de token admitidos para los normalizadores y es un subconjunto de los filtros de token generales que se usan en los analizadores personalizados.

Adición de normalizadores personalizados

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

token_filter_name_1 es el nombre del filtro de token y char_filter_name_1char_filter_name_2 son los nombres de los filtros char (consulte los filtros de token admitidos y las tablas de filtros de caracteres admitidosa 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 posterior mediante la actualización de uno existente. Agregar un normalizador personalizado a un índice existente requiere que se especifique la marca "allowIndexDowntime" en El índice de actualización y hará que el índice no esté disponible durante unos segundos.

Ejemplo de normalizador personalizado

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

  • Un normalizador personalizado denominado "my_custom_normalizer" se define en la sección "normalizadores" de la definición de í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