Canalización de Ingest del atributo de Ingest

Se muestran las correlaciones de datos completas de la especificación, la base y el esquema para la categoría Atributo.

Correlación de campos de índice de Atributo de la base de datos

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​La siguiente secuencia de pasos ilustra la canalización de indexación de Atributo implementada en Apache NiFi. Para obtener información sobre cómo llamar al servicio de ingesta, consulte la API del servicio de in de introducción de búsqueda. Para obtener una lista completa de los campos y parámetros del índice Elasticsearch, consulte Tipos de campos de índice de Elasticsearch .

El flujo consta principalmente de dos etapas:
  1. Crear documento de Atributo
  2. Asociar valores de Atributo

Etapa 1: Crear un documento de Atributo ​​​​​​​​​​​​​​​​​​​

Esta etapa describe cómo transformar los datos de atributo y cargarlos en el índice de atributo. Empieza con la ejecución del SQL siguiente para recuperar los datos de atributos de la base de datos de Commerce.
 SELECT A.ATTR_ID, COALESCE(AD.LANGUAGE_ID, L.LANGUAGE_ID) LANGUAGE_ID, 
		A.STOREENT_ID, A.ATTRTYPE_ID, A.ATTRUSAGE, A.IDENTIFIER, A.SEQUENCE ATTR_SEQUENCE,
		A.DISPLAYABLE, A.SEARCHABLE, A.COMPARABLE, A.FACETABLE, A.MERCHANDISABLE, A.SWATCHABLE, 
		AD.NAME, AD.DESCRIPTION, AD.GROUPNAME, QD.QTYUNIT_ID, QD.DESCRIPTION QTY_DESCRIPTION, 
        L.LOCALENAME, F.MAX_DISPLAY, F.SELECTION,
		F.SEQUENCE FACET_SEQUENCE, F.FACET_ID, F.SORT_ORDER, F.ZERO_DISPLAY, F.GROUP_ID, F.KEYWORD_SEARCH,
		LOWER(S.SRCHFIELDNAME) || '_ntk_cs' FIELDNAME, A.STOREDISPLAY
	      FROM LANGUAGE L, ATTR A
	    	   LEFT JOIN ATTRDESC AD ON (A.ATTR_ID = AD.ATTR_ID AND AD.LANGUAGE_ID = ${param.langId})
	    	   LEFT JOIN QTYUNITDSC QD ON (AD.QTYUNIT_ID = QD.QTYUNIT_ID AND QD.LANGUAGE_ID = AD.LANGUAGE_ID)
	    	   LEFT JOIN FACET F ON (A.ATTR_ID = F.ATTR_ID AND
	    	 					     F.STOREENT_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL
	    	 					   					    WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
	    	   LEFT JOIN ATTRDICTSRCHCONF S ON (A.ATTR_ID = S.ATTR_ID AND
	    	                                    S.MASTERCATALOG_ID IN (SELECT C.CATALOG_ID FROM STORECAT C
	    	                                                            WHERE C.MASTERCATALOG = 1 AND C.STOREENT_ID IN 
	                                                                          (SELECT RELATEDSTORE_ID FROM STOREREL
	                                                                            WHERE STATE = 1 AND STRELTYP_ID = -4
	                                                                              AND STORE_ID = ${param.storeId})))
	     WHERE A.STOREENT_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL
	    	 					    WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}) AND L.LANGUAGE_ID = ${param.langId} ${extAttributeAnd}
         UNION
        SELECT S.SRCHATTR_ID, L.LANGUAGE_ID, ${param.storeId}, NULL, NULL, 'facet' || TO_CHAR(S.SRCHATTR_ID), NULL,
               1, 1, NULL, 1, NULL, 0, D.NAME, D.DESCRIPTION, NULL, NULL, NULL,  L.LOCALENAME, F.MAX_DISPLAY, F.SELECTION,
	           F.SEQUENCE FACET_SEQUENCE, F.FACET_ID, F.SORT_ORDER, F.ZERO_DISPLAY, F.GROUP_ID, F.KEYWORD_SEARCH, S.PROPERTYVALUE, 0
          FROM SRCHATTRPROP S, SRCHATTR A, FACET F, FACETDESC D, LANGUAGE L
         WHERE S.PROPERTYNAME = 'facet' AND S.PROPERTYVALUE NOT LIKE 'ad%' AND S.PROPERTYVALUE NOT LIKE 'price_%'
           AND S.SRCHATTR_ID = A.SRCHATTR_ID AND A.SRCHATTR_ID = F.SRCHATTR_ID
           AND (A.INDEXSCOPE IN   
		       (SELECT C.CATALOG_ID FROM STORECAT C
		         WHERE C.MASTERCATALOG = 1 AND C.STOREENT_ID IN
		               (SELECT RELATEDSTORE_ID FROM STOREREL
		                 WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
		    OR  A.INDEXSCOPE = 0)
		   AND L.LANGUAGE_ID = ${param.langId} AND D.LANGUAGE_ID = L.LANGUAGE_ID AND F.FACET_ID = D.FACET_ID
         ORDER BY 1
 OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY         
                
Tenga en cuenta que la segunda parte de la expresión UNION anterior se utiliza para incluir explícitamente entradas de faceta para la marca, la categoría y los precios. A continuación, el conjunto de resultados se pasa al procesador CreateAttributeDocumentFromDatabase para su transformación, utilizando la tabla siguiente para ​correlacionar el campo de base de datos devuelto desde el SQL anterior con un campo de índice en el índice de atributos:​
​Campo de índice​ Nombre​ Tipo de campo de índice ​​​Descripción
​​Identificador del documento​​
​id/tienda id_string ID interno de la tienda propietaria; se correlaciona con ATTR.STOREENT_ID
ID/​idioma id_string El identificador del idioma; se correlaciona con ATTRDESC.LANGUAGE_ID
ID/​atributo id_string El ID interno del atributo; se correlaciona con ATTR.ATTR_ID
​​identificador/especificación id_string Establecer en "​atributo"
identificador/​tienda id_string Una cadena que identifica de forma exclusiva la tienda propietaria; se correlaciona con ATTR.STOREENT_ID
​identificador/idioma id_string El entorno local de idioma de este atributo; se correlaciona desde ATTRDESC.LANGUAGE_ID
​identifier/attribute/raw raw El formato original del identificador de atributo; se correlaciona con ATTR.IDENTIFIER
​identifier/attribute/normalized normalizado Formato normalizado del identificador de atributo; se correlaciona con ATTR.IDENTIFIER
​​Datos sensibles al idioma​​​
​​nombre/raw raw El nombre que depende del idioma de este atributo; se correlaciona con ATTRDESC.NAME
​​nombre/normalizado normalizado ​Igual que anteriormente
​​descripción/raw raw Una descripción breve de este atributo; se correlaciona con ATTRDESC.DESCRIPTION
Propiedades​​​
displayable ​booleano Identifica si este atributo se muestra en el escaparate; se correlaciona con ATTR.DISPLAYABLE
searchable ​booleano Identifica si se puede buscar en este atributo; se correlaciona con ATTR.SEARCHABLE
facetable ​booleano Especifica que el atributo se utiliza como una faceta en el escaparate para la navegación por facetas; se correlaciona con ATTR.FACETABLE
comparable ​booleano Identifica si este atributo se puede utilizar para la comparación; se correlaciona con ATTR.COMPARABLE
​merchandisable ​booleano Especifica que el atributo se utiliza en la creación de normas de comercialización; se correlaciona con ATTR.MERCHANDISABLE
​swatchable ​booleano Identifica si este atributo puede visualizarse con imagen de muestra; se correlaciona con ATTR.SWATCHABLE
cinta boolean ​Identifica si este atributo se puede utilizar como cinta para su visualización; correlacionado con ATTR. STOREDISPLAY​
group ​id_string Especifica el nombre del grupo de atributos. Todos los atributos relacionados deben crearse con el mismo nombre de grupo.
​unit/identifier ​​id_string Las unidades en las que se mide este atributo; se correlaciona con ATTRVALDESC.QTYUNIT_ID
​unit/name/raw ​raw La descripción de esta unidad de cantidad; se correlaciona con QTYUNITDSC.DESCRIPTION
​Datos de navegación​​​​
sequence ​flotante El orden de visualización de los atributos de un grupo de atributos o en la raíz del diccionario de atributos; se correlaciona con ATTR.SEQUENCE
​facet/limit ​entero ​Los valores máximos que deben mostrarse en el escaparate de la faceta; se correlaciona con FACET.MAX_DISPLAY
​facet/zero ​booleano ​Describe si el atributo con facetas debe mostrar valores de recuento cero; se correlaciona con FACET.ZERO_DISPLAY
​facet/multiple booleano​ ​Describe si el atributo con facetas permite varias selecciones; se correlaciona con FACET.SELECTION
​facet/order ​entero​ ​El orden de visualización que debe utilizarse al mostrar los valores de la faceta; se correlaciona con FACET.SORT_ORDER
​facet/search ​booleano ​Describe si debe incluirse la faceta en la búsqueda por palabra clave; se correlaciona con FACET.KEYWORD_SEARCH
​​facet/sequence ​flotante ​La secuencia de la faceta que se muestra en el escaparate; se correlaciona con FACET.SEQUENCE
​facet/key ​​id_string La clave normalizada que se utiliza para las reglas de búsqueda; se correlaciona con ATTRDICTSRCHCONF.SRCHFIELDNAME
​facet/group ​​id_string ​El identificador de grupo interno de la faceta que se utilizará en el escaparate; correlacionado con FACET.GROUP_ID
Para ver un ejemplo de código, consulte Ejemplos de la etapa 1.

Etapa 2: Asociar valores de Atributo

Esta etapa describe cómo transformar los datos de valor de atributo y cargarlos en el índice de atributo. Empieza con la ejecución del SQL siguiente para recuperar los datos de valor de Atributo de la base de datos de Commerce:
SELECT LISTAGG(V.IDENTIFIER, '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) ATTRVAL_IDENTIFIER,
	       LISTAGG(COALESCE(VD.STRINGVALUE, ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) STRINGVALUE, 
	       LISTAGG(COALESCE(TO_CHAR(VD.INTEGERVALUE), ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) INTEGERVALUE, 
	       LISTAGG(COALESCE(TO_CHAR(VD.FLOATVALUE), ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) FLOATVALUE, 
	       LISTAGG(TO_CHAR(VD.SEQUENCE), ', ') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) ATTRVAL_SEQUENCE, 
	       LISTAGG(COALESCE(VD.QTYUNIT_ID, ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) QTYUNIT_ID,
	       LISTAGG(COALESCE(NULLIF(VD.IMAGE1,''), ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) IMAGE1, 
	       LISTAGG(COALESCE(NULLIF(VD.IMAGE2,''), ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) IMAGE2,
	       LISTAGG(V.ATTRVAL_ID, ', ') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) ATTRVAL_ID,
	       LISTAGG(COALESCE(QD.DESCRIPTION, ' '), '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) QTY_DESCRIPTION,
	       LISTAGG(A.ATTRTYPE_ID, '###') WITHIN GROUP (ORDER BY V.ATTRVAL_ID) ATTRTYPE_ID,
	       A.ATTR_ID
	  FROM ATTR A, ATTRVAL V, ATTRVALDESC VD, QTYUNITDSC QD
	 WHERE A.ATTR_ID = V.ATTR_ID AND V.ATTRVAL_ID = VD.ATTRVAL_ID AND VD.LANGUAGE_ID = ${param.langId} 
	   AND VD.QTYUNIT_ID = QD.QTYUNIT_ID AND QD.LANGUAGE_ID = VD.LANGUAGE_ID
	   AND A.STOREENT_ID IN (SELECT RELATEDSTORE_ID 
	                           FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}) ${extAttributeAnd}
	 GROUP BY A.ATTR_ID
         ORDER BY A.ATTR_ID
         OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY​    ​   

A continuación, el conjunto de resultados se pasa al procesador FindAttributeValuesFromDatabase para su transformación, utilizando la tabla siguiente para ​correlacionar el campo de base de datos devuelto desde el SQL anterior con un campo de índice en el índice de atributos:​​

​Campo de índice​ Nombre​ Tipo de campo de índice ​​​Descripción
​​Valores de Atributo​​​
values/id​ id_​string El ID exclusivo interno para este valor de atributo; se correlaciona con ATTRVAL.ATTRVAL_ID​​
​​valores/identificador ​​id_string El identificador externo para este valor de atributo; se correlaciona con ATTRVAL.​​IDENTIFIER
​​​valores/secuencia​ ​flotante ​​Un número que determina el orden de visualización de una lista de valores de atributo permitidos para un atributo determinado; se correlaciona con ATTRVALDESC.SEQUENCE
​​​​​valores/valor/bruto ​​id_string ​​​El valor de cadena de este valor de atributo; se correlaciona con ATTRVALDESC.STRINGVALUE​, ATTRVALDESC.FLOATVALUE o INTEGERVALUE
​​​​​valores/valor/normalizado normalizado Igual que anteriormente
​​​​​values/value/image1 raw La vía de acceso de image1 de este valor de atributo; correlacionado con ATTRVALDESC. IMAGE1
​​​​​valores/valor/imagen2 raw La ruta image2 de este valor de atributo; se correlaciona con ATTRVALDESC.IMAGE2
valores/unidad/identificador ​​id_string El identificador de unidad de medida en el que se mide este atributo; se correlaciona con ATTRVALDESC.QTYUNIT_ID
valores/unidad/nombre/bruto ​raw La descripción de la unidad de cantidad; se correlaciona con QTYUNITDSC.DESCRIPTION
Para ver un ejemplo de código, consulte Ejemplos de la etapa 2.

Ejemplos de la etapa 1

El código siguiente es un ejemplo de los datos de entrada para el procesador CreateAttributeDocumentFromDatabase.

{
  "LANGUAGE_ID": -1,
  "STOREENT_ID": 1,
  "ATTRTYPE_ID": null,
  "ATTR_ID": -1013,
  "ATTRUSAGE": null,
  "IDENTIFIER": "facet-1013               ",
  "ATTR_SEQUENCE": null,
  "DISPLAYABLE": 1,
  "SEARCHABLE": 1,
  "COMPARABLE": null,
  "FACETABLE": 1,
  "MERCHANDISABLE": null,
  "SWATCHABLE": 0,
  "NAME": "Category",
  "DESCRIPTION": "The category",
  "GROUPNAME": null,
  "QTYUNIT_ID": null,
  "QTY_DESCRIPTION": null,
  "LOCALENAME": "en_US           ",
  "MAX_DISPLAY": 20,
  "SELECTION": 0,
  "FACET_SEQUENCE": 0,
  "FACET_ID": -1001,
  "SORT_ORDER": 0,
  "ZERO_DISPLAY": 0,
  "GROUP_ID": 0,
  "KEYWORD_SEARCH": 1,
  "FIELDNAME": "parentCatgroup_id_search"
}
El procesador CreateAttributeDocumentFromDatabase transforma los datos de entrada en los siguientes datos de salida basándose en la tabla de asignación de índice:

{ "update": { "_id": "1--1--1013", "_index": ".auth.1.attribute.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "identifier": {
      "specification": "attribute",
      "language": "en_US",
      "attribute": {
        "normalized": "facet-1013",
        "raw": "facet-1013"
      },
      "key": "facet-1013"
    },
    "sequence": 0,
    "name": {
      "normalized": "Category",
      "raw": "Category"
    },
    "displayable": true,
    "description": {
      "raw": "The category"
    },
    "facetable": true,
    "id": {
      "language": "-1",
      "attribute": "-1013",
      "store": "1"
    },
    "facet": {
      "zero": false,
      "sequence": 0,
      "search": true,
      "limit": 20,
      "multiple": false,
      "key": "parentCatgroup_id_search",
      "order": 0,
      "group": "0"
    },
    "searchable": true,
    "__meta": {
      "created": "2020-07-28T14:55:54.911Z",
      "modified": "2020-07-28T14:55:54.911Z",
      "version": {
        "min": 0,
        "max": 0
      }
    },
    "swatchable": false
  },
  "doc_as_upsert": true
}

Ejemplos de la etapa 2

El código siguiente es un ejemplo de los datos de entrada para el procesador FindAttributeValuesFromDatabase.

{
  "ATTRVAL_IDENTIFIER": "Multi-color###Blue###Ivory###Light blue###Gray###White###Purple###Black###Denim###Taupe",
  "STRINGVALUE": "Multi-color###Blue###Ivory###Light blue###Gray###White###Purple###Black###Denim###Taupe",
  "INTEGERVALUE": " ### ### ### ### ### ### ### ### ### ",
  "FLOATVALUE": " ### ### ### ### ### ### ### ### ### ",
  "ATTRVAL_SEQUENCE": "1, 2, 3, 4, 5, 6, 7, 8, 9, 10",
  "QTYUNIT_ID": "C62             ###C62             ###C62             ###C62             ###C62             ###C62             ###C62             ###C62             ###C62             ###C62             ",
  "IMAGE1": " ### ### ### ### ### ### ### ### ### ",
  "IMAGE2": " ### ### ### ### ### ### ### ### ### ",
  "ATTRVAL_ID": "7000000000000000785, 7000000000000000786, 7000000000000000787, 7000000000000000788, 7000000000000000789, 7000000000000000790, 7000000000000000791, 7000000000000000792, 7000000000000000793, 7000000000000000794",
  "QTY_DESCRIPTION": "one###one###one###one###one###one###one###one###one###one",
  "ATTRTYPE_ID": "STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ",
  "ATTR_ID": 7000000000000000000
}
El procesador FindAttributeValuesFromDatabase transforma los datos de entrada con el ID de tienda y el ID de idioma pasados de la clase FlowFile de NiFi como atributos de flujo en la salida siguiente:

{ "update": { "_id": "1--1-7000000000000000000", "_index": ".auth.1.attribute.202006160325", "retry_on_conflict": 5, "_source": false } }

{
  "doc": {
    "values": [
      {
        "identifier": "Multi-color",
        "sequence": 1,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000785",
        "value": {
          "normalized": "Multi-color",
          "raw": "Multi-color"
        }
      },
      {
        "identifier": "Blue",
        "sequence": 2,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000786",
        "value": {
          "normalized": "Blue",
          "raw": "Blue"
        }
      },
      {
        "identifier": "Ivory",
        "sequence": 3,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000787",
        "value": {
          "normalized": "Ivory",
          "raw": "Ivory"
        }
      },
      {
        "identifier": "Light blue",
        "sequence": 4,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000788",
        "value": {
          "normalized": "Light blue",
          "raw": "Light blue"
        }
      },
      {
        "identifier": "Gray",
        "sequence": 5,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000789",
        "value": {
          "normalized": "Gray",
          "raw": "Gray"
        }
      },
      {
        "identifier": "White",
        "sequence": 6,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000790",
        "value": {
          "normalized": "White",
          "raw": "White"
        }
      },
      {
        "identifier": "Purple",
        "sequence": 7,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000791",
        "value": {
          "normalized": "Purple",
          "raw": "Purple"
        }
      },
      {
        "identifier": "Black",
        "sequence": 8,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000792",
        "value": {
          "normalized": "Black",
          "raw": "Black"
        }
      },
      {
        "identifier": "Denim",
        "sequence": 9,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000793",
        "value": {
          "normalized": "Denim",
          "raw": "Denim"
        }
      },
      {
        "identifier": "Taupe",
        "sequence": 10,
        "unit": {
          "identifier": "C62",
          "name": {
            "raw": "one"
          }
        },
        "id": "7000000000000000794",
        "value": {
          "normalized": "Taupe",
          "raw": "Taupe"
        }
      }
    ],
    "__meta": {
      "modified": "2020-07-28T15:18:30.965Z"
    }
  }
}