Asignación de resultados enriquecidos a campos de un índice de búsqueda en Azure AI Search

Fases del indexador

En este artículo se explica cómo configurar asignaciones de campos de salida, definiendo una ruta de acceso de datos entre estructuras de datos en memoria creadas durante el procesamiento de conjuntos de aptitudes y campos de destino en un índice de búsqueda. Una asignación de campos de salida se define en un indizador y tiene los siguientes elementos:

"outputFieldMappings": [
  {
    "sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],

En contraste con una fieldMappings definición que asigna una ruta de acceso entre dos estructuras de datos físicas, una outputFieldMappings definición asigna enriquecimientos en memoria a los campos de un índice de búsqueda.

Las asignaciones de campos de salida son necesarias si el indizador tiene un conjunto de aptitudes adjunto que crea nueva información, como la traducción de texto o la extracción de frases clave. Durante la ejecución del indexador, la información generada por IA solo existe en memoria. Para conservar esta información en un índice de búsqueda, deberá indicar al indizador dónde enviar los datos.

Las asignaciones de campos de salida también se pueden usar para recuperar el tipo complejo de los nodos específicos de un documento de origen. Por ejemplo, es posible que desee simplemente "FullName/LastName" en una propiedad "FullName" de varias partes. Si no necesita la estructura compleja completa, puede aplanar los nodos individuales de una estructura de datos anidada y, a continuación, usar una asignación de campos de salida para enviar la salida a una colección de cadenas en el índice de búsqueda.

Las asignaciones de campos de salida se aplican a:

  • Contenido en memoria creado por aptitudes o extraído mediante un indexador. El campo de origen es un nodo de un árbol de documentos enriquecido.

  • Índices de búsqueda. Si va a rellenar un almacén de conocimiento, use proyecciones para la configuración de la ruta de acceso de datos. Si rellena campos vectoriales, no se usan asignaciones de campos de salida.

Las asignaciones de campos de salida se aplican después de la ejecución del conjunto de aptitudes o después del descifrado de documentos si no hay ningún conjunto de aptitudes asociado.

Definición de una asignación de campos de salida

Las asignaciones de campos de salida se agregan a la matriz outputFieldMappings en una definición de indexador, normalmente colocadas después de la matriz fieldMappings. Una asignación de campos consta de tres partes.

"fieldMappings": []
"outputFieldMappings": [
  {
    "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],
Propiedad Descripción
sourceFieldName Necesario. Especifica una ruta de acceso al contenido enriquecido. Un ejemplo podría ser /document/content. Para ver ejemplos y la sintaxis de la ruta de acceso, consulte Enriquecimientos de referencia en un conjunto de aptitudes de Azure AI Search.
targetFieldName Opcional. Especifica el campo de búsqueda que recibe el contenido enriquecido. Los campos de destino deben ser campos o colecciones simples de nivel superior. No puede ser una ruta de acceso a un subcampo en un tipo complejo. Si desea recuperar nodos específicos en una estructura compleja, puede acoplar nodos individuales en memoria y, a continuación, enviar la salida a una colección de cadenas en el índice.
mappingFunction Opcional. Agrega procesamiento adicional proporcionado por las funciones de asignación compatibles con los indexadores. Para los nodos de enriquecimiento, la codificación y la descodificación son las funciones más usadas.

Puede usar el portal, la API de REST o un SDK de Azure para definir asignaciones de campos.

Sugerencia

Los indexadores creados por el Asistente para importación de datos incluyen asignaciones de campos de salida generadas por el asistente. Si necesita ejemplos, ejecute el asistente sobre el origen de datos para ver la definición representada.

Use Create Indexer (REST) o Update Indexer (REST), en cualquier versión de API.

En este ejemplo se agregan entidades y etiquetas de opinión extraídas de la propiedad de contenido de un blob a los campos de un índice de búsqueda.

PUT https://[service name].search.windows.net/indexers/myindexer?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
    "name": "myIndexer",
    "dataSourceName": "myDataSource",
    "targetIndexName": "myIndex",
    "skillsetName": "myFirstSkillSet",
    "fieldMappings": [],
    "outputFieldMappings": [
        {
            "sourceFieldName": "/document/content/organizations/*/description",
            "targetFieldName": "descriptions",
            "mappingFunction": {
                "name": "base64Decode"
            }
        },
        {
            "sourceFieldName": "/document/content/organizations",
            "targetFieldName": "orgNames"
        },
        {
            "sourceFieldName": "/document/content/sentiment",
            "targetFieldName": "sentiment"
        }
    ]
}

En cada asignación de campo de salida, establezca la ubicación de los datos del árbol de documentos enriquecidos (sourceFieldName) y el nombre del campo al que se hace referencia en el índice (targetFieldName). Asigne las funciones de asignación necesarias para transformar el contenido de un campo antes de almacenarlo en el índice.

Acoplar estructuras complejas en una colección de cadenas

Si los datos de origen se componen de JSON anidados o jerárquicos, no puede usar asignaciones de campos para configurar las rutas de acceso de datos. En su lugar, el índice de búsqueda debe reflejar la estructura de datos de origen para cada nivel para una importación completa.

Esta sección le guía a través de un proceso de importación que genera una reflexión uno a uno de un documento complejo en los lados de origen y destino. A continuación, usa el mismo documento de origen para ilustrar la recuperación y acoplamiento de nodos individuales en colecciones de cadenas.

Este es un ejemplo de un documento en Azure Cosmos DB con JSON anidado:

{
   "palette":"primary colors",
   "colors":[
      {
         "name":"blue",
         "medium":[
            "acrylic",
            "oil",
            "pastel"
         ]
      },
      {
         "name":"red",
         "medium":[
            "acrylic",
            "pastel",
            "watercolor"
         ]
      },
      {
         "name":"yellow",
         "medium":[
            "acrylic",
            "watercolor"
         ]
      }
   ]
}

Si quisiera indexar completamente el documento de origen anterior, crearía una definición de índice en la que los nombres de campo, los niveles y los tipos se reflejan como un tipo complejo. Dado que las asignaciones de campos no se admiten para tipos complejos en el índice de búsqueda, la definición del índice debe reflejar el documento de origen.

{
  "name": "my-test-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true},
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "colors", "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "name",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "medium",
          "type": "Collection(Edm.String)",
          "searchable": true,
          "retrievable": true,
        }
      ]
    }
  ]
}

Esta es una definición de indexador de ejemplo que ejecuta la importación (observe que no hay asignaciones de campos ni ningún conjunto de aptitudes).

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-test-index",

  "fieldMappings": [],
  "outputFieldMappings": []
}

El resultado es el siguiente documento de búsqueda de ejemplo, similar al original en Azure Cosmos DB.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "colors": [
        {
          "name": "blue",
          "medium": [
            "acrylic",
            "oil",
            "pastel"
          ]
        },
        {
          "name": "red",
          "medium": [
            "acrylic",
            "pastel",
            "watercolor"
          ]
        },
        {
          "name": "yellow",
          "medium": [
            "acrylic",
            "watercolor"
          ]
        }
      ]
    }
  ]
}

Una representación alternativa en un índice de búsqueda consiste en acoplar nodos individuales en la estructura anidada del origen en una colección de cadenas en un índice de búsqueda.

Para realizar esta tarea, necesitará un outputFieldMappings que asigne un nodo en memoria a una colección de cadenas en el índice. Aunque las asignaciones de campos de salida se aplican principalmente a las salidas de aptitud, también puede usarlas para dirigir los nodos después de "descifrado de documentos" donde el indexador abre un documento de origen y lo lee en la memoria.

A continuación se muestra una definición de un índice de ejemplo y se usan colecciones de cadenas para recibir una salida acoplada:

{
  "name": "my-new-flattened-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true },
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "color_names", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true },
    { "name": "color_mediums", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true}
  ]
}

Esta es la definición del indexador de ejemplo, mediante outputFieldMappings para asociar el JSON anidado a los campos de colección de cadenas. Observe que el campo de origen usa la sintaxis de ruta de acceso para los nodos de enriquecimiento, aunque no haya ningún conjunto de aptitudes. Los documentos enriquecidos se crean en el sistema durante el descifrado de documentos, lo que significa que puede acceder a los nodos de cada árbol de documentos siempre que existan esos nodos cuando se descifra el documento.

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-new-flattened-index",
  "parameters": {  },
  "fieldMappings": [   ],
  "outputFieldMappings": [
    {
       "sourceFieldName": "/document/colors/*/name",
       "targetFieldName": "color_names"
    },
    {
       "sourceFieldName": "/document/colors/*/medium",
       "targetFieldName": "color_mediums"
    }
  ]
}

Los resultados de la definición anterior son los siguientes. Simplificar la estructura pierde el contexto en este caso. Ya no hay ninguna asociación entre un color determinado y los medios en los que está disponible. Sin embargo, dependiendo de su escenario, un resultado similar al que se muestra a continuación podría ser exactamente lo que necesita.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "color_names": [
        "blue",
        "red",
        "yellow"
      ],
      "color_mediums": [
        "[\"acrylic\",\"oil\",\"pastel\"]",
        "[\"acrylic\",\"pastel\",\"watercolor\"]",
        "[\"acrylic\",\"watercolor\"]"
      ]
    }
  ]
}

Consulte también