Pipeline d'index Produit Ingest

Les mappages de données complets à partir de la spécification, de la base de données et du schéma sont affichés pour la catégorie Produit.

Spécification des données de produit

Nom de la zone de données Type de données Valeur de données
/uniqueId long L'identificateur interne de l'entrée de catalogue Commerce.
/identifier chaîne L'identificateur de l'entrée de catalogue externe.
/type chaîne Le type d'entrée de catalogue - ProductBean, ItemBean, PackageBean, BundleBean.
​/manufacturerIdentifier chaîne Le nom du fabricant
​/buyable boolean Indique si cette entrée de catalogue peut être achetée individuellement. Paramètre par défaut : false.
​/availabilityDate date La date à laquelle cette entrée de catalogue devient disponible.
​/prices/value chaîne Valeur de l'un des prix.
​/prices/currency​ chaîne Devise de ce prix.
​/prices/usage chaîne Prix catalogue ou prix de vente.
​​/items/uniqueId long L'identificateur interne de l'entrée de catalogue Commerce de ses enfants.
​/items/identifier chaîne L'identificateur de l'entrée de catalogue externe de cette entrée enfant.
​/items/sequence float La séquence de cette entrée enfant répertoriée dans son parent.
/​components/uniqueId long L'identificateur interne de l'entrée de catalogue Commerce de ses sous-composants.
​/components/identifier chaîne L'identificateur de l'entrée de catalogue externe de ce sous-composant.
​/components/type chaîne Un des types d'entrées de catalogue : produit, article, paquet, groupement.
​/components/quantity float Une quantité qui peut être associée à la relation.
​/parentCategories/parentCategoryId long L'identificateur interne de la catégorie Commerce de la catégorie parent de cette entrée de catalogue.
​/parentCategories/categoryIdentifier chaîne L'identificateur de catégorie externe de cette catégorie parent.
​/parentCategories/catalogId long L'identificateur interne du catalogue Commerce. S'il n'est pas spécifié, le catalogue de magasin par défaut est utilisé.
/parentCategories/​catalogIdentifier chaîne L'identificateur de catalogue externe pour cette catégorie parent.
​/parentCategories/sequence float Le numéro de séquence utilisé pour déterminer l'ordre d'affichage dans cette catégorie parent.
​/descriptions/languageId entier L'identificateur interne de la langue Commerce. S'il n'est pas spécifié, "paramètre régional" sera utilisé. Si "paramètre régional" n'est pas spécifié, la langue par défaut du magasin est utilisée.
​/descriptions/locale chaîne L'identificateur des paramètres régionaux.
​/descriptions/name chaîne Le nom dépendant de la langue de cette entrée de catalogue.
​/descriptions/description chaîne La brève description de cette entrée de catalogue.
​/descriptions/longDescription chaîne La description détaillée de cette entrée de catalogue.
​/descriptions/keywords chaîne Une liste de mots clés utilisés pour la recherche.
​/descriptions/thumbnail chaîne ​Le chemin de l'image miniature de cette entrée de catalogue.
​/descriptions/fullImage chaîne Le chemin de l'image en taille réelle de cette entrée de catalogue.
​/descriptions/published boolean Indique si cette entrée de catalogue doit être affichée pour la langue actuelle. Paramètre par défaut : false.
​/descriptions/sequence float L'ordre de ce document dans la catégorie actuelle.
​/attributes/uniqueId long L'identificateur interne de l'attribut Commerce.
​/attributes/identifier chaîne L'identificateur externe de cet attribut.
​/attributes/usage chaîne
​/attributes/sequence float L'ordre d'affichage des attributs dans un groupe d'attributs ou dans la racine du dictionnaire d'attributs.
​/attributes/descriptions/languageId​ entier Identificateur de langue interne de cette description d'attribut.
​/attributes/descriptions/locale chaîne Le paramètre régional de cette description d'attribut.
​/attributes/descriptions/name chaîne Le nom dépendant de la langue de cet attribut.
​/attributes/descriptions/description chaîne La brève description de cet attribut qui dépend de la langue
​/attributes/descriptions/thumbnail chaîne Le chemin de l'image miniature de cet attribut.
​/attributes/values/uniqueId chaîne L'identificateur interne Commerce de cette valeur d'attribut.
​/attributes/values/identifier chaîne L'identificateur externe de cette valeur d'attribut.
​/attributes/values/unitId chaîne L'identificateur interne Commerce pour les unités dans lesquelles cette valeur d'attribut est mesurée.
​/attributes/values/descriptions/languageId entier Identificateur de langue interne de cette description de valeur d'attribut.
​/attributes/values/descriptions/locale chaîne Le paramètre régional de cette description de valeur d'attribut.
​/attributes/values/descriptions/value chaîne La valeur de cet attribut.
​/attributes/values/descriptions/thumbnail chaîne Le chemin de l'image miniature de cette valeur d'attribut.
​/attributes/values/descriptions/sequence float Un nombre qui détermine l'ordre d'affichage d'une liste de valeurs d'attributs admises pour un attribut spécifique.

Mappage de la zone d'index Produit à partir de la spécification de données

Les diagrammes suivants illustrent le pipeline d'indexation Produit implémenté dans Apache NiFi. Le flux se compose principalement de quatre étapes :
  1. Chargement du document du produit
  2. Déplacement vers le bas des propriétés de niveau produit vers ses articles
  3. Déplacement vers le haut des propriétés de niveau article vers son parent
  4. Génération d'une hiérarchie de catalogue et de chemins de navigation pour chaque catégorie de vente
Note: La définition des alias de type zone (en italique) est décrite dans la page Indexer les alias de type de zone et les utilisations.
Etape 1 : Chargement du document du produit
​​​Cette étape décrit comment les données Produit peuvent être transformées et chargées dans l'index Produit à l'aide du script Groovy CreateProductDocument.
La table de mappage​ suivante définit comment les données de Spécification des données de produit peuvent être mappées dans le schéma d'index Produit dans Elasticsearch :​
Nom​ de zone d'index​ Type de zone d'index Comment la valeur peut être affectée
_id interne identifier/specification + id/store + id/language + id/catalog + id/catentry
​__meta/version/min entier Défini par le processeurInjectMetaData
__méta/version/max entier Identique à ci-dessus
__méta/créé date Identique à ci-dessus
__meta/modified​ date Identique à ci-dessus
​id/store id_integer Défini par le processeurInjectMetaData
id/langue id_integer Assigné directement à partir de la zone de données "languageId"
id/​catalog id_long Défini par le processeurInjectMetaData
id/​catentry ​id_long Assigné directement à partir de la zone de données "uniqueId"
​id/member ​​id_long
​identifier/specification id_​string Toujours défini sur "produit"
​identifier/​store id_​string Défini par le processeurInjectMetaData
​identifier/language id_​string Extrait uniquement de la partie langue de la zone de données "paramètre régional"
​identifier/catalog id_​string Défini par le processeurInjectMetaData
​identifier/sku/raw ​​raw Assigné directement à partir de la zone de données "identifier"
​identifier/sku/normalized normalilsé Identique à ci-dessus
​name/raw ​​raw Assigné directement à partir de la zone de données "name"
​​name/normalized normalized Identique à ci-dessus
​name/text texte Identique à ci-dessus
​​description/raw ​​raw Assigné directement à partir de la zone de données "description"
​description/text texte Identique à ci-dessus
​description/long ​​raw Assigné directement à partir de la zone de données "longDescription"
​keyword/text texte Assigné directement à partir de la zone de données "keyword"
​manufacturer/raw ​​raw Assigné directement à partir de la zone de données "manufacturer"
manufacturer/normalized normalized Identique à ci-dessus
type id_​string produit, article, paquet, groupement.
proposé à l'achat boolean Assigné directement à partir de la zone de données "buyable"
displayable boolean Assigné directement à partir du champ de données "published" de la langue actuelle
début date Assigné directement à partir de la zone de données "startDate"
end date Assigné directement à partir de la zone de données "endDate"
url/​thumbnail raw Assigné directement à partir de la zone de données "thumbnail"
url/​image raw Assigné directement à partir de la zone de données "fullimage"
url/​​seo raw TBD
kit/​components mot clé TBD
kit/​preconfigured entier TBD
kit/model mot clé TBD
​kit/configurable entier TBD
kit/​parent/model mot clé TBD
kit/parent/configurable entier TBD
kit/​parent/id long TBD
kit/URL mot clé TBD
kit/default_configuration mot clé TBD
kit/​​pdks mot clé TBD
correction texte Utiliser l'outil de suggestion de termes au niveau de cette zone au moment de la requête
Achèvement Achèvement
suggestion search_as_you_type copié à partir de name, shortDescription, unstructured, partNumbe
​defaultSearch texte
​prices/offer_<currency>[_<contract>] float Zone dynamique affectuée directement à partir de la zone de données "prices" avec l'utilisation "Offer"
prices/list_<currency>[_<contract>] float Zone dynamique affectuée directement à partir de la zone de données "prices" avec l'utilisation "Display"
​sequences/cmc_<parentCategoryId> float Assigné à partir de la zone de données "sequence" dans parentCategories, avec le nom de la zone qui se termine par l'identificateur de la catégorie parent
​​attributes/<identifier>/number float Zone dynamique assignée directement à partir des attributs descriptifs de son parent remplis à l'étape 1
​​attributes/<identifier>/date date Identique à ci-dessus
​attributes/<identifier>/raw raw Identique à ci-dessus
​attributes/<identifier>/text texte Identique à ci-dessus
relationship/name join Une relation à sens unique. Valeurs prises en charge : produit, article, paquet, groupement, variante
​​relationship/parent ​id_long Même que ci-dessous
​​relationship/sequence float Assigné à partir de la zone de données "sequence" dans "article" ; s'applique uniquement aux articles
​relationship/child​​/id ​id_long Assigné à partir de la zone de données "uniqueId" dans "articles"
​​relationship/child/sequence float Assigné à partir de la zone de données "sequence" dans "article" ; s'applique uniquement aux articles
​category/name texte Nom de la catégorie parent, recherché dans l'index des catégories
​category/catalog ​​id_long Assigné à partir de la zone de données "catalogId" dans "parentCategories"
​​category/parent ​id_long Assigné à partir de la zone de données "parentCategoryId" dans "parentCategories"
category/sequence​​ float Assigné à partir de la zone de données "parentCategories" dans "parentCategories"
Etape 2 : Déplacement vers le bas des propriétés de niveau produit vers ses articles
Cette étape décrit comment les propriétés et les attributs d'une entrée de produit peuvent être envoyés vers tous ses articles enfant dans l'index Produit.
Il commence par exécuter la requête Elasticsearch suivante au niveau de l'index Produit :

	  {
		"stored_fields": [
		  "id.*",
		  "relationship.*",
		  "attributes.*"
		],
		"size": "10000",
		"_source": false,
		"query": {
		  "bool": {
			"must": {
			  "match_all": {}
			},
			"filter": [
			  {
				"term": {
				  "relationship.name": "product"
				}
			  },
			  {
				"term": {
				  "id.store": "${param.storeId}"
				}
			  },
			  {
				"term": {
				  "id.catalog": "${param.catalogId}"
				}
			  },
			  {
				"term": {
				  "id.language": "${param.langId}"
				}
			  }
			]
		  }
		}
	  }
Ensuite, le jeu de résultats est transmis au script Groovy PushDownParentProperties pour transformation :
{ ​"script" : {
    "source" : "ctx._source.path = params.value",
    "params" : {
      "value" : "/1"
    },
    "lang" : "painless"
  },
  "query" : {
    "term" : {
      "category.parent" : "1"
    }
  }
}​​
Etape 3 : Déplacement vers le haut des propriétés de niveau article vers son parent
Cette étape décrit comment les propriétés et les attributs d'une entrée de produit peuvent être envoyés vers son produit parent dans l'index Produit.
Vous commencez le processus en exécutant cette requête Elasticsearch au niveau de l'index Produit.
  {
	"stored_fields": [
	  "id.*",
	  "attributes.def_*",
	  "relationship.*"
	],
	"size": "10000",
	"_source": false,
	"query": {
	  "bool": {
		"must": {
		  "match_all": {}
		},
		"filter": [
		  {
			"term": {
			  "relationship.name": "item"
			}
		  },
		  {
			"term": {
			  "id.store": "${param.storeId}"
			}
		  },
		  {
			"term": {
			  "id.catalog": "${param.catalogId}"
			}
		  },
		  {
			"term": {
			  "id.language": "${param.langId}"
			}
		  }
		]
	  }
	}
  }
Ensuite, le jeu de résultats est transmis au script Groovy RollUpChildProperties pour transformation.
Note: Le jeu de résultats initial de la requête de recherche ci-dessus renvoie tous les attributs Définition au niveau article. Ces attributs seront ensuite copiés dans leur parent respectif.
Etape 4 : Génération d'une hiérarchie de catalogue pour la navigation
Cette étape décrit comment les données de navigation peuvent être générées et chargées dans l'index Produit.
Il commence par exécuter la requête Elasticsearch suivante au niveau de l'index Catégorie :
  {
	"stored_fields": [
	  "id.*",
	  "path*"
	],
	"size": "10000",
	"_source": false,
	"query": {
	  "bool": {
		"must": {
		  "match_all": {}
		},
		"filter": [
		  {
			"term": {
			  "id.store": "${param.storeId}"
			}
		  },
		  {
			"term": {
			  "id.catalog": "${param.catalogId}"
			}
		  },
		  {
			"term": {
			  "id.language": "${param.langId}"
			}
		  }
		]
	  }
	}
  }​
Ensuite, le jeu de résultats est transmis au script Groovy BuildCatalogHierarchyForProduct pour transformation et utilise les logiques suivantes pour générer l'arborescence de navigation.
Note: Le jeu de résultats initial à partir de la requête de recherche ci-dessus renvoie toutes les catégories du catalogue de vente donné. En supposant qu'il ne peut y avoir qu'un seul chemin de navigation pour chaque catégorie de vente, le script indolore suivant sera généré pour attribuer le chemin de navigation de la catégorie actuelle à tous ses produits et articles enfant :
{
  "script" : {
    "source" : "ctx._source.path = params.value",
    "params" : {
      "value" : "/1"
    },
    "lang" : "painless"
  },
  "query" : {
    "term" : {
      "category.parent" : "1"
    }
  }
}​
Nom​ de zone d'index​ Type de zone d'index Description
chemin texte Zone segmentée pour le chemin de navigation complet vers son nœud de catégorie parent dans le catalogue de vente
path/tree hiérarchie p. ex. /apparel/women/dresses, /apparel/women, /apparel
​path/reversed hierarchy_reversed par exemple /dresses, /women/dresses, /apparel/women/dresses

Mappage de la zone d'index Produit à partir de la base de données

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​La séquence d'étapes suivante ​illustre le pipeline d'indexation Produit implémenté dans Apache NiFi. Le flux se compose principalement de douze étapes :
  1. Création du document Produit
  2. Application du remplacement de niveau du site
  3. Association des abonnements
  4. Association de la relation du produit parent et enfant
  5. Application de la relation de jeu de produits pour l'autorisation du contrat
  6. Génération de l'association de marchandisage
  7. Association de pièces jointes de produit et d'images d'angle
  8. Génération d'une hiérarchie de catalogue pour la navigation
  9. Association des attributs
  10. Déplacement vers le haut des attributs de niveau article vers leurs parents
  11. Déplacement vers le bas des propriétés de niveau produit vers ses articles
  12. Association d'attributs descriptifs enfant
  13. Association des pièces jointes enfant

Etape 1 : Création du document du produit

Le flux de données ci-dessus décrit comment les données Produit peuvent être transformées et chargées dans l'index Produit.

Le flux de données ci-dessus décrit comment les données Produit peuvent être transformées et chargées dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
​SELECT C.CATENTRY_ID, C.MEMBER_ID, C.CATENTTYPE_ID, C.PARTNUMBER, C.MARKFORDELETE, C.BUYABLE, C.STATE,
	   COALESCE(D.LANGUAGE_ID, L.LANGUAGE_ID) LANGUAGE_ID,
           COALESCE(C.MFPARTNUMBER, VP.MFPARTNUMBER) MFPARTNUMBER,
           COALESCE(C.MFNAME,VP.MFNAME) MFNAME,
           COALESCE(C.STARTDATE,VP.STARTDATE) STARTDATE,
           COALESCE(C.ENDDATE,VP.ENDDATE) ENDDATE,
           COALESCE(D.NAME, PD.NAME) NAME,
           COALESCE(D.SHORTDESCRIPTION, PD.SHORTDESCRIPTION) SHORTDESCRIPTION,
           COALESCE(D.KEYWORD, PD.KEYWORD) KEYWORD,
           D.THUMBNAIL, D.FULLIMAGE, D.PUBLISHED, 
	   R.CATALOG_ID, L.LOCALENAME, S.STOREENT_ID, PD.THUMBNAIL PARENT_THUMBNAIL, PD.FULLIMAGE PARENT_FULLIMAGE
     FROM CATGPENREL R, LANGUAGE L, STORECAT S, CATENTRY C
     ${TI_DELTA_JOIN_QUERY}
     LEFT OUTER JOIN CATENTDESC D ON (D.CATENTRY_ID=C.CATENTRY_ID AND D.LANGUAGE_ID = ${param.langId})
     LEFT OUTER JOIN CATENTREL PV ON (C.CATENTRY_ID = PV.CATENTRY_ID_CHILD AND PV.CATRELTYPE_ID IN ('PRODUCT_VARIANT', 'PRODUCT_ITEM')
                                                                                  AND PV.CATENTRY_ID_CHILD <> PV.CATENTRY_ID_PARENT)
     LEFT OUTER JOIN CATENTRY VP ON (VP.CATENTRY_ID = PV.CATENTRY_ID_PARENT)
     LEFT OUTER JOIN CATENTDESC PD ON (PV.CATENTRY_ID_PARENT=PD.CATENTRY_ID AND PD.LANGUAGE_ID = ${param.langId})
     WHERE R.CATALOG_ID = ${param.catalogId}
           AND R.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
               (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
           AND R.CATENTRY_ID = C.CATENTRY_ID AND C.MARKFORDELETE = 0
           AND S.CATALOG_ID = R.CATALOG_ID AND L.LANGUAGE_ID = ${param.langId} ${extCatentryAndSQL}
         ORDER BY CATENTRY_ID
            OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY      
Ensuite, le jeu de résultats est transmis au processeur CreateProductDocumentFromDatabase pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​
Nom de zone d'index Type de zone d'index ​​Description
Identificateur du document.
​id/store id_​string ID interne du magasin propriétaire ; mappé à la table STORECENT
id/langue id_​string L'identificateur de la langue ; mappé à CATENTDESC​.LANGUAGE_ID
id/​catalog id_​string Catalogue parent de Catentry ; mappé à la table CATGPENREL
id/​catentry id_​string Attributs de base de Catentry ; mappé à CATENTRY.CATENTRY_ID
​id/member ​​id_string Le numéro de référence interne qui identifie le propriétaire de l'entrée de catalogue ; mappé à CATENTRY.MEMBER_ID
​identifier/specification id_​string Défini sur "produit"
identificateur/magasin id_​string ​Une chaîne qui identifie de façon unique le magasin propriétaire ; mappé à la table STOREENT​
​identifier/language id_​string Le paramètre régional linguistique de cette entrée de catalogue ; mappé depuis CATENTDESC.LANGUAGE_ID
​​identifier/catalog id_​string L'identificateur externe du catalogue de vente ; mappé à CATGPENREL
​identifier/sku/raw ​​raw La SKU de l'entrée de catalogue ; mappé à CATENTRY.PARTNUMBER
​identifier/sku/normalized normalilsé Identique à ci-dessus
​identifier/pn/raw ​​raw Le numéro de référence identifiant le numéro de pièce de l'entrée de catalogue ; mappé à CATENTRY.PARTNUMBER
​identifier/pn/normalized normalilsé Identique à ci-dessus
​identifier/mpn/raw ​​raw Le numéro de référence identifiant le numéro de pièce du fabricant de l'entrée de catalogue ; mappé à CATENTRY.MFPARTNUMBER
​identifier/mpn/normalized normalilsé Identique à ci-dessus
Données sensibles à la langue
​name/raw ​​raw Le nom dépendant de la langue de cette entrée de catalogue ; mappé à CATENTDESC.NAME
​​name/normalized normalized Identique à ci-dessus
​name/text texte Identique à ci-dessus
​keyword/text texte Un mot clé utilisé pour la recherche ; mappé à CATENTDESC.KEYWORD
url/​thumbnail raw Le chemin de l'image miniature de cette entrée de catalogue ; mappé à CATENTDESC.THUMBNAIL
​url/​image raw Le chemin de l'image complet de cette entrée de catalogue ; mappé à CATENTDESC.FULLIMAGE
url/​​seo raw
Propriétés
​manufacturer/raw ​​raw Nom du fabricant ou de l'entreprise de l'entrée de catalogue ; mappé à CATENTRY.MFNAME
manufacturer/normalized normalized Identique à ci-dessus
manufacturer/text texte Identique à ci-dessus
type id_​string produit, article, package, groupement ; mappé à CATENTRY.CATENTTYPE_ID
proposé à l'achat boolean Indique si cette entrée de catalogue peut être achetée individuellement ; mappé à ​CATENTRY​​​.BUYABLE
displayable boolean Indique si cette entrée de catalogue doit être affichée pour la langue ; mappé à CATENTDESC.PUBLISHED
début date La date d'introduction de cette entrée de catalogue ; mappé à CATENTRY.STARTDATE
end date La date de retrait de cette entrée de catalogue ; mappé à CATENTRY.ENDDATE
état boolean L'état d'une catentry ; mappé à CATENTRY.STATE
Langage naturel
​natural/nouns/raw​ raw Cette zone contient des noms extraits de zones indexées dans ce document actuel à utiliser avec la recherche de langage naturel
​natural/nouns/normalized normalized Identique à ci-dessus
​natural/adjectives/raw ​​raw Cette zone contient toutes les valeurs non numériques des attributs consultables du document en cours
​​natural/adjectives/normalized normalized Identique à ci-dessus
​natural/names/raw ​​raw Cette zone contient des noms extraits du document actuel à l'aide de l'extracteur d'entité de nom Stanford
​natural/names/normalized normalized Identique à ci-dessus
​natural/categories/raw raw Cette zone contient une liste de noms de catégorie normalisés copiés à partir de la zone catégorie/nom
​natural/categories/normalized normalized Identique à ci-dessus
​natural/locations​/raw raw Cette zone contient n'importe quel nom spécifique de l'emplacement extrait par le marqueur de catégories grammaticales Stanford
​natural/locations​/normalized normalized Identique à ci-dessus
​​natural/intents/raw raw Cette zone contient des intentions potentielles qui peuvent être utilisées pour établir une correspondance avec l'intention du client au moment de l'interrogation
​​natural/intents/normalized normalized Identique à ci-dessus
Données de navigation
relationship/name mot clé Une relation à sens unique. Valeurs prises en charge : produit, article, paquet, groupement, variante
​relationship/product/id id_string​ ​Produit parent de catentry ; mappé​ au tableau CATENTREL
​relationship​​/product/sequence float Séquence d'affichage de Catentry ; mappé à la table : CATENTREL
​relationship/variant/id id_string​ ​Produit parent de la variante ; mappé au tableau : CATENTREL
​relationship​​/variant/sequence float Séquence d'affichage de la variante ; mappé au tableau : CATENTREL
​​relationship/item/id id_string​ Catentry enfant de catentry ; mappé au tableau : CATENTREL
​relationship​​/item/sequence float Séquence d'affichage de Catentry ; mappé à la table : CATENTREL
Auto-achèvement et correction orthographique
default/​correction texte Utilisez l'outil de suggestion de termes sur cette zone au moment de la requête pour fournir la fonction de correction orthographique basée sur le terme. Disposer d'une zone dédiée distincte pour la suggestion de termes permet la suggestion de termes différents. La réutilisation de la zone de recherche par défaut ne peut pas fournir cette précision de contrôle. Par défaut, seuls le nom, la description et le mot clé sont copiés dans cette zone.
default/completion Achèvement En alimentant une liste de tous les achèvements possibles, et l'outil de suggestion d'achèvement les génère dans un transducteur à l'état fini, la structure de données optimisée ressemble à un grand graphique. Pour rechercher des suggestions, Elasticsearch commence au début du graphique et se déplace caractère par caractère le long du chemin de correspondance. Lorsqu'il n'a plus d'entrées de l'utilisateur, il examine toutes les fins possibles du cheminement actuel pour produire une liste de suggestions. Cette structure de données vit dans la mémoire et rend les recherches de préfixes extrêmement rapides, beaucoup plus rapides que ne pourrait l'être n'importe quelle requête basée sur un terme. C'est exactement ce qu'il faut pour le remplissage automatique des noms et des marques, dont les mots sont généralement organisés dans un ordre commun. Lorsque l'ordre des mots est moins prévisible, les n-gram de bord (search_as_you_type) peuvent être une meilleure solution que l'outil de suggestion d'achèvement. Par défaut, seuls le nom, la description et le mot clé sont copiés dans cette zone.
default/​suggestion search_as_you_type Le type de zone search_as_you_type est une zone de type texte optimisée pour fournir des requêtes qui servent un cas d'utilisation d'achèvement au fur et à mesure de la saisie. Il crée une série de sous-zones (n-gram) qui sont analysées pour indexer des termes qui peuvent être efficacement mis en correspondance par une requête qui correspond partiellement à la totalité de la valeur du texte indexé. L'achèvement du préfixe (c'est-à-dire les termes correspondants qui commencent au début de la saisie) et l'achèvement de l'infixe (c'est-à-dire les termes correspondants à n'importe quelle position dans l'entrée) sont pris en charge. Par défaut, seuls le nom, la description et le mot clé sont copiés dans cette zone.
Valeur par défaut
default/​search/text texte Une zone pratique pour effectuer la recherche de texte avec l'analyseur standard. Les données sont préconfigurées pour être copiées dans cette zone : nom, description, mot clé, nom de catégorie et certaines valeurs d'attribut consultables. Remarque: le fabricant et le SKU ne peuvent pas être copiés dans car le nom de la marque et le numéro de pièce seront indiqués sous forme de jeton et généreront de faux accès inutiles.
default/​search/normalized normalized Identique à la zone de recherche par défaut ci-dessus, sauf que le type de données est normalisé dans le cas présent. Les données préconfigurées sont également les mêmes que search.text, en plus de celles du fabricant et de la SKU

Etape 2 : Application du remplacement de niveau du site

Cette étape décrit comment les données associées à Remplacement de produit peuvent être transformées et chargées dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT C.CATENTRY_ID, O.LANGUAGE_ID, O.NAME, O.SHORTDESCRIPTION, O.KEYWORD, O.FULLIMAGE, O.THUMBNAIL, L.LOCALENAME
           FROM CATENTRY C ${TI_DELTA_JOIN_QUERY}, CATENTDESCOVR O, LANGUAGE L
           WHERE C.CATENTRY_ID = O.CATENTRY_ID AND O.LANGUAGE_ID = ${param.langId} AND L.LANGUAGE_ID = O.LANGUAGE_ID AND C.MARKFORDELETE = 0
                   AND C.CATENTRY_ID IN 
                  (SELECT R.CATENTRY_ID FROM CATGPENREL R
    	              WHERE R.CATALOG_ID = ${param.catalogId} AND R.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
                       (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))) ${extCatentryAndSQL}	 
Ensuite, le jeu de résultats est transmis au processeur FindOverridesFromDatabase pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​​
Nom de zone d'index Type de zone d'index ​​Description
​​Données sensibles à la langue​​​
​name/override/raw raw Le remplacement de niveau magasin pour le nom de cette entrée de catalogue ; mappé à CATENTDESCOVR​.NAME
name/override/normalized normalized Identique à ci-dessus
name/override/text texte Identique à ci-dessus
​keyword/override/text​ raw Le remplacement de niveau magasin pour le mot clé de cette entrée de catalogue ; mappé à ​CATENTDESCOVR​.KEYWORD​
​description/override/raw raw Le remplacement de niveau magasin pour la brève description de cette entrée de catalogue ; mappé à CATENTDESCOVR.SHORTDESCRIPTION
description/override/text texte Identique à ci-dessus
url/override/thumbnail raw ​Le remplacement du niveau magasin par le chemin de l'image de miniature de cette entrée de catalogue​ ; mappé à CATENTDESCOVR​​.THUMBNAIL
​​url/override/image raw ​Le remplacement du niveau magasin par le chemin de l'image en taille réelle de cette entrée de catalogue​; mappé à CATENTDESCOVR​​.FULLIMAGE​

Etape 3 : Association des abonnements

Cette étape décrit comment les abonnements peuvent être générés et chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT C.CATENTRY_ID, S.DISALLOW_REC_ORDER, T.SUBSCPTYPE_ID
		FROM CATENTRY C ${TI_DELTA_JOIN_QUERY}, CATENTSUBS S, SUBSCPTYPE T
		WHERE S.SUBSCPTYPE_ID = T.SUBSCPTYPE_ID AND C.CATENTRY_ID = S.CATENTRY_ID AND C.MARKFORDELETE = 0
		    AND C.CATENTRY_ID IN 
		  (SELECT R.CATENTRY_ID FROM CATGPENREL R
		   WHERE R.CATALOG_ID = ${param.catalogId} AND R.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
		         (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))) ${extCatentryAndSQL}​     
Ensuite, le jeu de résultats est transmis au processeur FindSubscriptionsFromDatabase​ pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​​
Nom de zone d'index Type de zone d'index ​​Description
​subscription/type raw Le type d'abonnement auquel l'entrée de catalogue peut être abonnée.
​​subscription/recurring boolean Indique s'il est impossible d'acheter cette entrée de catalogue par le biais d'une commande récurrente. La valeur par défaut est true.

Etape 4 : Association de la relation du produit parent et enfant

Cette étape décrit comment la relation des articles peut être générée et chargée dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
 SELECT L.CATENTRY_ID_PARENT,
  	     LISTAGG(L.CATENTRY_ID_CHILD, ', ') WITHIN GROUP (ORDER BY L.CATENTRY_ID_CHILD) CATENTRY_ID_CHILD,
	     LISTAGG(TO_CHAR(L.SEQUENCE), ', ') WITHIN GROUP (ORDER BY L.CATENTRY_ID_CHILD) SEQUENCE,
	     LISTAGG(L.CATRELTYPE_ID, '###') WITHIN GROUP (ORDER BY L.CATENTRY_ID_CHILD) CATRELTYPE_ID,
	     LISTAGG(R.CATALOG_ID, '###') WITHIN GROUP (ORDER BY L.CATENTRY_ID_CHILD) CATALOG_ID,
	     NULL AS COMPONENT_ID,
	     NULL AS QUANTITY
	FROM CATENTREL L, CATGPENREL R, CATENTRY C
	${TI_DELTA_JOIN_QUERY}
   WHERE R.CATALOG_ID IN
         (SELECT CATALOG_ID FROM STORECAT
           WHERE STOREENT_ID IN
	             (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
	 AND R.CATENTRY_ID = C.CATENTRY_ID AND C.MARKFORDELETE = 0 AND C.CATENTRY_ID = L.CATENTRY_ID_PARENT
	 AND C.CATENTTYPE_ID NOT IN ('ItemBean') ${extCatentryAndSQL}
	 AND L.CATRELTYPE_ID NOT IN ('BUNDLE_COMPONENT', 'PACKAGE_COMPONENT')
	 AND L.CATENTRY_ID_CHILD IN (SELECT CATENTRY_ID FROM CATENTRY CE Where CE.CATENTRY_ID = L.CATENTRY_ID_CHILD AND CE.MARKFORDELETE = 0)
   GROUP BY L.CATENTRY_ID_PARENT
   UNION
  SELECT CATENTRY_ID_PARENT,
         LISTAGG(KITCOMP.CATENTRY_ID_CHILD,', ') WITHIN GROUP (ORDER BY KITCOMP.CATENTRY_ID_CHILD) CATENTRY_ID_CHILD,
         LISTAGG(TO_CHAR(KITCOMP.SEQUENCE),', ') WITHIN GROUP (ORDER BY KITCOMP.CATENTRY_ID_CHILD) SEQUENCE,
         LISTAGG(KITCOMP.CATRELTYPE_ID, '###') WITHIN GROUP (ORDER BY KITCOMP.CATENTRY_ID_CHILD) CATRELTYPE_ID,
         LISTAGG(KITCOMP.CATALOG_ID, '###') WITHIN GROUP (ORDER BY KITCOMP.CATENTRY_ID_CHILD) CATALOG_ID,
         LISTAGG(KITCOMP.COMPONENT_ID, ', ') WITHIN GROUP (ORDER BY KITCOMP.CATENTRY_ID_CHILD) COMPONENT_ID,
         LISTAGG(TO_CHAR(KITCOMP.QUANTITY), ', ') WITHIN GROUP (ORDER BY KITCOMP.CATENTRY_ID_CHILD) QUANTITY
    FROM (SELECT L.CATENTRY_ID_PARENT, L.CATENTRY_ID_CHILD, L.SEQUENCE, R.CATALOG_ID, CATENTRY_ID_CHILD COMPONENT_ID, QUANTITY, L.CATRELTYPE_ID
            FROM CATENTREL L, CATGPENREL R, CATENTRY C
			${TI_DELTA_JOIN_QUERY}
           WHERE R.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT
                                   WHERE STOREENT_ID IN
                                         (SELECT RELATEDSTORE_ID FROM STOREREL
                                           WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
	         AND R.CATENTRY_ID = C.CATENTRY_ID AND C.MARKFORDELETE = 0 AND C.CATENTRY_ID = L.CATENTRY_ID_PARENT
	         AND L.CATENTRY_ID_CHILD IN (SELECT CATENTRY_ID FROM CATENTRY CE Where CE.CATENTRY_ID = L.CATENTRY_ID_CHILD AND CE.MARKFORDELETE = 0)
		     AND CATRELTYPE_ID in ('BUNDLE_COMPONENT','PACKAGE_COMPONENT') ${extCatentryAndSQL}) KITCOMP
   GROUP BY KITCOMP.CATENTRY_ID_PARENT
  OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY             
Ensuite, le jeu de résultats est transmis au processeur FindChildItemsFromDatabase​ pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​​
Nom de zone d'index Type de zone d'index ​​Description
​Données de navigation​​​​
​​relationship/item/id ​​id_string Catentry enfant de catentry ; mappé à la table CATENTREL
​relationship​​/item/sequence float Séquence d'affichage de Catentry ; mappé à la table : CATENTREL
​​relationship/component/id id_​string Une liste des identificateurs des composants des groupements et des packages ; mappé à la table CATENTREL
​relationship/component/quantity float La quantité de chacun des composants ci-dessus

Etape 5 : Application de la relation de jeu de produits pour l'autorisation du contrat

Cette étape décrit comment l'autorisation de niveau produit peut être chargée dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT C.CATENTRY_ID, R.PRODUCTSET_ID
	  FROM CATENTRY C, PRSETCEREL R
	 WHERE C.CATENTRY_ID = R.CATENTRY_ID AND C.MARKFORDELETE = 0
	   AND C.CATENTRY_ID IN
	       (SELECT G.CATENTRY_ID FROM CATGPENREL G
	         WHERE G.CATALOG_ID = ${param.catalogId} AND G.CATALOG_ID IN
	               (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
	               ​(SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))) 
	 ORDER BY R.CATENTRY_ID	
Ensuite, le jeu de résultats est transmis au script Groovy FindEntitlementsFromDatabase pour transformation, à l'aide de la table suivante pour mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :
Nom de zone d'index Type de zone d'index ​​Description
​Données de navigation​​​​
​relationship/set id_string Une liste d'ensembles de produits auxquels cette catentry a participé ; mappé à PRSETCEREL.PRODUCTSET_ID

Etape 6 : Génération d'associations de marchandisage

Cette étape décrit comment les prix de vente et catalogue peuvent être chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT M.CATENTRY_ID_FROM,
		   LISTAGG(M.MASSOCTYPE_ID, '###') WITHIN GROUP (ORDER BY M.RANK) TYPE,
		   LISTAGG(TO_CHAR(COALESCE(M.RANK, 0)), ', ') WITHIN GROUP (ORDER BY M.RANK) RANK,
		   LISTAGG(TO_CHAR(COALESCE(M.QUANTITY, 0)), ', ') WITHIN GROUP (ORDER BY M.RANK) QUANTITY,
		   LISTAGG(M.CATENTRY_ID_TO, ', ') WITHIN GROUP (ORDER BY M.RANK) CATENTRY_ID_TO
	  FROM MASSOCCECE M ${TI_DELTA_JOIN_QUERY_MASSOCCECE}
	 WHERE M.STORE_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}) ${extCatentryIdFromAndSQL}
	 GROUP BY M.CATENTRY_ID_FROM
Ensuite, le jeu de résultats est transmis au processeur FindAssociationsFromDatabase​ pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​​
Nom de zone d'index Type de zone d'index ​​Description
Associations de marchandisage
​​associations/id ​​id_string L'ID d'entrée de catalogue de la cible de cette association de marchandisage ; mappé à MASSOCCECE.CATENTRY_ID_FROM
​​associations/type ​​id_string L'identificateur du type d'association de marchandisage ; mappé à MASSOCCECE.MASSOCTYPE_ID
​​associations/rank float Le numéro de séquence utilisé pour l'ordre d'affichage ; mappé à MASSOCCECE.RANK
​​associations/quantity float La quantité liée à cette association ; mappé à MASSOCCECE.QUANTITY

Etape 7 : Association de pièces jointes de produit et d'images d'angle

Cette étape décrit comment les pièces jointes du produit peuvent être associés à un document et chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT CE.CATENTRY_ID,
	       LISTAGG(ATCHAST.ATCHAST_ID, ', ') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) ATCHAST_ID,
	       LISTAGG(ATCHTGT.IDENTIFIER, '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) IDENTIFIER,
               LISTAGG(COALESCE(NULLIF(ATCHRELDSC.NAME,''), ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) NAME,
               LISTAGG(COALESCE(NULLIF(ATCHRELDSC.SHORTDESCRIPTION,''), ' '), '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) SHORTDESCRIPTION,
	       LISTAGG(COALESCE(ATCHAST.ATCHASTPATH, ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) ATCHASTPATH,
               LISTAGG(COALESCE(NULLIF(ATCHAST.DIRECTORYPATH,''), ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) DIRECTORYPATH,
               LISTAGG(COALESCE(NULLIF(ATCHAST.MIMETYPE,''), ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) MIMETYPE,
	       LISTAGG(ATCHASTLG.LANGUAGE_ID, ', ') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) LANGUAGE_ID,
	       LISTAGG(COALESCE(ATCHRLUS.IMAGE, ' '), '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) IMAGE,
	       LISTAGG(COALESCE(ATCHRLUS.IDENTIFIER, ' '), '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) RULENAME,
               LISTAGG(TO_CHAR(ATCHREL.SEQUENCE), ', ') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) SEQUENCE
	  FROM CATENTRY CE
		   ${TI_DELTA_JOIN_QUERY_ATTCH}
	  	   JOIN ATCHREL ON (ATCHREL.BIGINTOBJECT_ID = CE.CATENTRY_ID)
		   JOIN ATCHOBJTYP ON (ATCHREL.ATCHOBJTYP_ID = ATCHOBJTYP.ATCHOBJTYP_ID AND ATCHOBJTYP.IDENTIFIER = 'CATENTRY')
		   LEFT JOIN ATCHTGT ON (ATCHREL.ATCHTGT_ID = ATCHTGT.ATCHTGT_ID )
		   JOIN ATCHAST ON (ATCHAST.ATCHTGT_ID = ATCHTGT.ATCHTGT_ID)
		   LEFT JOIN ATCHASTLG ON (ATCHASTLG.ATCHAST_ID = ATCHAST.ATCHAST_ID) 
		   LEFT JOIN ATCHRELDSC ON (ATCHRELDSC.ATCHREL_ID = ATCHREL.ATCHREL_ID AND ATCHRELDSC.LANGUAGE_ID= ${param.langId})
		   JOIN ATCHRLUS ON (ATCHREL.ATCHRLUS_ID = ATCHRLUS.ATCHRLUS_ID)
	 WHERE (ATCHASTLG.ATCHASTLG_ID IS NULL OR ATCHASTLG.LANGUAGE_ID=${param.langId})
	   AND CE.CATENTRY_ID IN (SELECT C.CATENTRY_ID FROM CATGPENREL R, CATENTRY C
	                           WHERE R.CATALOG_ID = ${param.catalogId} AND R.CATALOG_ID IN
	                                 (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
	                                 (SELECT RELATEDSTORE_ID FROM STOREREL
	                                   WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
	                             AND R.CATENTRY_ID = C.CATENTRY_ID AND C.MARKFORDELETE = 0 AND C.CATENTTYPE_ID <> 'ItemBean') ${extCatentryAndSQL1a}
	 GROUP BY CE.CATENTRY_ID	 
	       
Ensuite, le jeu de résultats est transmis au processeur FindAttachmentsFromDatabase​ pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​
Pièces jointes
attachments/​id​ id_string​ L'identificateur interne de l'actif de pièces jointes
attachments/​identifier​ id_​string L'identificateur du type d'objet de pièce jointe
attachments/​name/raw​ raw Le nom dépendant de la langue pour la relation de pièce jointe.
​attachments/​description/raw​ ​​raw La description abrégée de la relation de pièce jointe.
attachments/​url​ ​​raw Le chemin d'accès de l'actif de pièces jointes est le chemin d'accès relatif de l'actif des pièces jointes qui inclut le chemin d'accès du répertoire et le nom de fichier de l'actif de pièces jointes
attachments/​mime​ normalized Le codage de type MIME de la ressource de pièce jointe
attachments/​sequence​ float Le numéro de séquence pour l'affichage de la relation de pièce jointe
attachments/​rule​ ​​raw L'identificateur d'utilisation de la relation de pièce jointe qui décrit l'utilisation de cette relation de pièce jointe.
Images
​images/sequence float Numéro de séquence pour l'affichage de la pièce jointe d'image d'angle​; mappée à ATCHREL.SEQUENCE​​​ si ATCHRLUS.IDENTIFIER​​ égal à ​ANGLEIMAGES_FULLIMAGE ou ANGLEIMAGES_THUMBNAIL
​​​images/image id_​string Le chemin de l'actif de pièces jointes d'image d'angle est le chemin d'accès relatif qui inclut le chemin d'accès du répertoire et le nom de fichier de la pièce jointe d'image d'angle ; mappée à ATCHAST​.ATCHASTPATH​​​​​​​ si ATCHRLUS.IDENTIFIER​ ​est égal à ​ANGLEIMAGES_FULLIMAGE​
​​images/thumbnail id_​string Le chemin de l'actif de pièces jointes d'image d'angle est le chemin d'accès relatif qui inclut le chemin d'accès du répertoire et le nom de fichier de la pièce jointe d'image d'angle ; mappée à ATCHAST​.ATCHASTPATH​​​​​​​ si ATCHRLUS.IDENTIFIER​ ​est égal à ​ANGLEIMAGES_THUMBNAIL​
​​images/name id_​string N​om dépendant de la langue pour la pièce jointe d'image d'angle ; mappé à ATCHRELDSC.NAME​​ si ATCHRLUS. IDENTIFIER​ ​est égal à ​ANGLEIMAGES_FULLIMAGE ou ANGLEIMAGES_THUMBNAIL​
Valeur par défaut
​​default/attachment/text texte Identique à la zone de recherche par défaut pour la recherche de texte, sauf que cette zone n'est que la portée du nom et de la description des pièces jointes.

Etape 8 : Génération d'une hiérarchie de catalogue pour la navigation

Cette étape décrit comment la hiérarchie du catalogue peut être associée à un document et chargée dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT C.CATENTRY_ID,
                   LISTAGG(R.CATGROUP_ID, '###') WITHIN GROUP (ORDER BY R.CATGROUP_ID) CATGROUP_ID,
	           LISTAGG(TO_CHAR(R.SEQUENCE), '###') WITHIN GROUP (ORDER BY R.CATGROUP_ID) SEQUENCE
          FROM CATGPENREL R, STORECAT S, CATENTRY C
			${TI_DELTA_JOIN_QUERY}
         WHERE R.CATALOG_ID = ${param.catalogId}
           AND R.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
               (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
           AND R.CATENTRY_ID = C.CATENTRY_ID AND S.CATALOG_ID = R.CATALOG_ID ${extCatentryAndSQL}
         GROUP BY C.CATENTRY_ID ORDER BY C.CATENTRY_ID
              OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY  
			
		
Ensuite, le jeu de résultats est transmis au processeur FindParentCategoryFromDatabase pour transformation, puis utilise​ le contrôleur CatalogService​ pour obtenir des données à partir de DistributedMapCacheClient​. Les données de hiérarchie de catalogue pour chaque catentry sont stockées en cache à l'aide des étapes ci-dessous -
  • Il commence par exécuter la requête Elasticsearch suivante au niveau de l'index Catégorie :​
    {
      "stored_fields": [
        "id*",
        "category.*",
        "name.*",
        "path"
      ],
      "size": ${es.pageSize},
      "query": {
        "bool": {
          "must_not": {
            "exists": {
              "field": "category.parent"
            }
          },
          "filter": [
            {
              "term": {
                "id.store": "${param.storeId}"
              }
            },
            {
              "term": {
                "id.catalog": "${param.catalogId}"
              }
            },
            {
              "term": {
                "id.language": "${param.langId}"
              }
            }
          ]
        }
      }
    }​​
  • Le jeu de résultats initial à partir de la requête de recherche ci-dessus renvoie toutes les catégories de niveau supérieur du catalogue donné. Utilisation de toutes les catégories enfant de cet ensemble de catégories de niveau supérieur pour générer une autre requête Elasticsearch afin de rechercher les catégories enfant de niveau suivant du catalogue de vente actuel :
    {
        "stored_fields": [
            "id*",
            "category.*",
            "name.*"​​,
             
        ],
        "size": 10000,
        "query": {
            "bool": {
                "must": {
                    "match_all": {}
                },
                "filter": [
                    {
                        "terms": {
                            "category.parent": [
                                "10020", ...
                            ]
                        }
                    },
                    {
                        "term": {
                            "id.store": "1"
                        }
                    },
                    {
                        "term": {
                            "id.catalog": "10502"
                        }
                    },
                    {
                        "term": {
                            "id.language": "-1"
                        }
                    }
                ]
            }
        }
    }​​
Note: La requête ci-dessus sera ensuite renvoyée au flux de données dans NiFi pour réexécution.
  • La requête ci-dessus sera ensuite renvoyée au flux de données dans NiFi pour réexécution.
Nom de zone d'index Type de zone d'index Description
Données de navigation
identifier id_​string catalogId + ID de chemin de catégorie séparés par un trait d'union menant à la catégorie racine
category/<identifier>/name normalized Le nom de cette catégorie de vente parent
category/<identifier>/parent​ id_​string La catégorie parent de ce document actuel utilisé pour la séquence
category/<identifier>/sequence float La séquence de niveau catégorie de feuilles (peu profonde) définie dans CMC
category/<identifier>/path/id id_​string Une liste des ID internes de catégorie menant à la catégorie racine
category/<identifier>/path/name ​​raw Liste similaire des catégories menant à la racine, sauf que cette zone stocke le nom de la catégorie à la place
path/<catalogId>/tree ​​raw Zone segmentée pour le chemin de navigation complet vers le nœud de catégorie actuel dans le catalogue de vente. Par exemple, lorsqu'une catégorie "robe" (id:10001) avec le chemin d'accès "/1/3/10001" est indexée pour le catalogue de vente 10502, cette zone stocke la forme originale du chemin d'accès

Etape 9 : Association des attributs

Cette étape décrit comment les attributs du produit et de l'article peuvent être associés à un document et chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT CEA.CATENTRY_ID,
            LISTAGG(CEA.USAGE, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) USAGE,
            LISTAGG(AD.LANGUAGE_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) LANGUAGE_ID,
            LISTAGG(A.STOREENT_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STOREENT_ID,
            LISTAGG(A.ATTRTYPE_ID, '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRTYPE_ID,
            LISTAGG(CEA.ATTR_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_ID,
            LISTAGG(TO_CHAR(COALESCE(CEA.SEQUENCE, 0)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_SEQUENCE,
            LISTAGG(A.IDENTIFIER, '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_IDENTIFIER, 
            LISTAGG(COALESCE(A.DISPLAYABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) DISPLAYABLE, 
            LISTAGG(COALESCE(A.SEARCHABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) SEARCHABLE, 
            LISTAGG(COALESCE(A.COMPARABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) COMPARABLE, 
            LISTAGG(COALESCE(A.FACETABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) FACETABLE,
            LISTAGG(COALESCE(A.MERCHANDISABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) MERCHANDISABLE, 
            LISTAGG(COALESCE(A.SWATCHABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) SWATCHABLE,
            LISTAGG(COALESCE(A.STOREDISPLAY, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STOREDISPLAY,
            LISTAGG(COALESCE(AD.NAME, ADF.NAME), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_NAME, 
            LISTAGG(COALESCE(COALESCE(AD.GROUPNAME, ADF.GROUPNAME), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) GROUPNAME, 
            LISTAGG(V.IDENTIFIER, '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_IDENTIFIER,
            LISTAGG(COALESCE(COALESCE(VD.STRINGVALUE, VDF.STRINGVALUE), ' ' ), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STRINGVALUE, 
            LISTAGG(COALESCE(TO_CHAR(COALESCE(VD.INTEGERVALUE, VDF.INTEGERVALUE)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) INTEGERVALUE, 
            LISTAGG(COALESCE(TO_CHAR(COALESCE(VD.FLOATVALUE, VDF.FLOATVALUE)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) FLOATVALUE, 
            LISTAGG(COALESCE(TO_CHAR(COALESCE(VD.SEQUENCE, VDF.SEQUENCE)), '0'), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_SEQUENCE, 
            LISTAGG(COALESCE(COALESCE(VD.QTYUNIT_ID, VDF.QTYUNIT_ID), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) QTYUNIT_ID,
            LISTAGG(COALESCE(NULLIF(COALESCE(VD.IMAGE1, VDF.IMAGE1), ''), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) IMAGE1,
	    LISTAGG(COALESCE(NULLIF(COALESCE(VD.IMAGE2, VDF.IMAGE2), ''), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) IMAGE2,
            LISTAGG(CEA.ATTRVAL_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_ID,
            LISTAGG(COALESCE(COALESCE(QD.DESCRIPTION, QDF.DESCRIPTION), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) QTY_DESCRIPTION
       FROM (SELECT CER.CATENTRY_ID_CHILD CATENTRY_ID, CEATTR.SEQUENCE, CEATTR.ATTR_ID, CEATTR.ATTRVAL_ID, CEATTR.USAGE
               FROM CATENTRYATTR CEATTR,
                    (SELECT A.CATENTRY_ID_PARENT CATENTRY_ID_PARENT,A.CATENTRY_ID_CHILD CATENTRY_ID_CHILD 
                       FROM CATENTREL A,
                            (SELECT G.CATENTRY_ID
                               FROM CATGPENREL G,CATENTRY E 
                              WHERE G.CATENTRY_ID = E.CATENTRY_ID AND G.CATALOG_ID = ${param.catalogId} AND E.MARKFORDELETE = 0 
                                AND G.CATALOG_ID IN ( SELECT CATALOG_ID FROM STORECAT
                                                       WHERE STOREENT_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId} )) 
                             ) B,
                            CATENTRY C 
                      WHERE A.CATENTRY_ID_PARENT=B.CATENTRY_ID AND C.CATENTRY_ID=A.CATENTRY_ID_CHILD AND C.MARKFORDELETE=0 AND A.CATRELTYPE_ID IN ('PRODUCT_VARIANT') 
                      UNION 
                     SELECT A.CATENTRY_ID CATENTRY_ID_PARENT,A.CATENTRY_ID CATENTRY_ID_CHILD 
                       FROM (SELECT G.CATENTRY_ID FROM CATGPENREL G,CATENTRY E 
                              WHERE G.CATENTRY_ID = E.CATENTRY_ID AND G.CATALOG_ID = ${param.catalogId} AND E.MARKFORDELETE = 0 
                                AND G.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT
                                                      WHERE STOREENT_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId} )) 
                             ) A 
                    ) CER
              WHERE CEATTR.CATENTRY_ID = CER.CATENTRY_ID_PARENT AND CEATTR.ATTRVAL_ID <> 0
                AND (CER.CATENTRY_ID_PARENT = CER.CATENTRY_ID_CHILD OR 
                    (SELECT COUNT(*) FROM CATENTRYATTR WHERE CATENTRYATTR.CATENTRY_ID = CER.CATENTRY_ID_CHILD AND CEATTR.ATTR_ID = CATENTRYATTR.ATTR_ID) = 0) ) CEA
              INNER JOIN ATTR A ON (CEA.ATTR_ID = A.ATTR_ID)
              INNER JOIN ATTRVAL V ON (CEA.ATTRVAL_ID = V.ATTRVAL_ID)
			   ${TI_DELTA_JOIN_QUERY_ATTR}	
               LEFT OUTER JOIN ATTRDESC AD ON (A.ATTR_ID = AD.ATTR_ID AND AD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN ATTRDESC ADF ON (A.ATTR_ID = ADF.ATTR_ID AND ADF.LANGUAGE_ID = ${default.language})
               LEFT OUTER JOIN ATTRVALDESC VD ON (V.ATTRVAL_ID = VD.ATTRVAL_ID AND VD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN ATTRVALDESC VDF ON (V.ATTRVAL_ID = VDF.ATTRVAL_ID AND VDF.LANGUAGE_ID = ${default.language})
               LEFT OUTER JOIN QTYUNITDSC QD ON (VD.QTYUNIT_ID = QD.QTYUNIT_ID AND QD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN QTYUNITDSC QDF ON (VD.QTYUNIT_ID = QDF.QTYUNIT_ID AND QDF.LANGUAGE_ID = ${default.language}) ${extCatentryWhereSQL}
       GROUP BY CEA.CATENTRY_ID
       ORDER BY CEA.CATENTRY_ID
  OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY
     
	         
Ensuite, le jeu de résultats est transmis au processeur FindAttributesFromDatabase​​ pour transformation, à l'aide du tableau suivant pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit :​​
Nom de zone d'index Type de zone d'index ​​Description
Propriétés
​​attributes/<identifier>/identifier ​​id_string L'identificateur d'attributs externe ; mappé à ATTR.IDENTIFIER
​attributes​​/<id>/id id_​string L'identificateur d'attributs interne ; mappé à ATTR.ATTR_ID
​attributes​​/<id>/key id_​string L'identificateur d'attributs normalisé utilisé comme clé pour cette entrée d'attribut actuelle ; généré à partir de ATTR.IDENTIFIER
​​attributes/<id>/displayable boolean Identifie si cet attribut peut être affiché sur la vitrine ; mappé à ATTR.DISPLAYABLE
​attributes​​/<id>/merchandisable boolean Indique si l'attribut est utilisé dans la création de règles de marchandisage ; mappé à ATTR.MERCHANDISING
​​attributes/<id>/searchable boolean Identifie si cet attribut peut être recherché ; mappé à ATTR.SEARCHABLE
​attributes​​/<id>/facetable boolean Spécifie que l'attribut est utilisé comme une facette dans la vitrine du magasin pour la navigation à facettes ; mappé à ATTR.FACETABLE
​​attributes/<id>/comparable boolean Identifie si cet attribut peut être utilisé pour la comparaison ; mappé à ATTR.COMPARABLE
​attributes​​/<id>/swatchable boolean Identifie si cet attribut peut être affiché avec l'image d'échantillon ; mappé à ATTR.SWATCHABLE
​attributes​​/<id>/ribbon boolean ​​Identifie si cet attribut peut être affiché en tant que ruban ; mappé à ATTR.STOREDISPLAY​​
​​attributes/<id>/image1 ​​raw Le chemin d'accès de la première image de cette valeur d'attribut ; mappé à ATTRVALDESC.IMAGE1
​attributes​​/<id>/image2 ​​raw Le chemin d'accès de la deuxième image de cette valeur d'attribut ; mappé à ATTRVALDESC.IMAGE2
​​attributes/<id>/sequence float L'ordre d'affichage des attributs dans un groupe d'attributs ou dans la racine du dictionnaire d'attributs ; ATTR.SEQUENCE
​attributes​​/<id>/usage raw Définit l'utilisation de l'attribut ; mappé à ATTR.ATTRUSAGE
​attributes​​/<id>/group raw Définit le nom de groupe de l'attribut ; mappé à ATTRDESC.GROUPNAME
​​attributes/<id>/name/raw ​​raw Le nom de cet attribut ; mappé à ATTRDESC.NAME
​attributes​​/<id>/name/text texte Identique à ci-dessus
​​attributes/<id>/name/normalized normalized Identique à ci-dessus
​​attributes/<id>/value/identifier ​​id_string L'identificateur externe de cette valeur d'attribut ; mappé à ATTRVAL.IDENTIFIER
​attributes​​/<id>/value/id​ id_​string L'ID unique interne pour cette valeur d'attribut ; mappé à ATTRVAL.ATTRVAL_ID
​​​attributes/<id>/value/raw ​​id_string La valeur de chaîne de cette valeur d'attribut ; mappé à ATTRVALDESC.STRINGVALUE​, FLOATVALUE ou INTEGERVALUE
​attributes​​/<id>/value/sequence​ float Un nombre qui détermine l'ordre d'affichage d'une liste de valeurs d'attributs admises pour un attribut spécifique ; mappé à ATTRVALDESC.SEQUENCE
​​attributes/<id>/value/unit/identifier ​​id_string L'identificateur d'unité de mesure dans lequel cet attribut est mesuré ; mappé à ATTRVALDESC.QTYUNIT_ID
​attributes​​/<id>/value/unit/name/raw raw La description de l'unité de quantité ; mappé à QTYUNITDSC.DESCRIPTION
​Langage naturel​​​​​
natural/<attribute_type>/colors/red plage Il s'agit de la zone spécifique à MatchMaker pour le traitement des couleurs. Le type d'attribut peut être de définition ou de description.
natural/<attribute_type>/colors/green plage Identique à ci-dessus
natural/<attribute_type>/colors/blue plage Identique à ci-dessus
​natural/<attribute_type>/measurements/<unit_of_measure> plage Il s'agit des zones spécifiques à MatchMaker pour le traitement des mesures. Voici les unités de mesures prises en charge : - Longueur : kilomètre, mètre, centimètre, millimètre, micromètre, nanomètre, pied, pouce, mile, yard - Poids : tonne métrique, kilogramme, gramme, milligramme, stone, livre, once - Temps  : nanoseconde, microseconde, milliseconde, seconde, minute, heure, jour, semaine, mois, année - Volume : gallon, litre, millilitre​Le type d'attribut peut être de définition ou de description.
natural/<attribute_type>/dimensions/width/<unit_of_measure> plage Il s'agit des zones spécifiques à MatchMaker pour le traitement de la dimension. Les éléments ci-après sont l'unité de mesure prise en charge:- kilomètre, mètre, centimètre, millimètre, micromètre, nanomètre, pied, pouce, mile, yard​Le type d'attribut peut être de définition ou de description.
natural/<attribute_type>/dimensions/length/<unit_of_measure> plage Identique à ci-dessus
natural/<attribute_type>/dimensions/height/<unit_of_measure> plage Identique à ci-dessus

Etape 10 : Déplacement vers le haut des attributs de niveau article vers leurs parents

Cette étape décrit comment les attributs de niveau articles peuvent être déplacés vers le haut de leur document parent et chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
         SELECT CEA.CATENTRY_ID_PARENT CATENTRY_ID,
	        LISTAGG(CEA.USAGE, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) USAGE,
	        LISTAGG(CAST(AD.LANGUAGE_ID AS VARCHAR(32000)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) LANGUAGE_ID,
	        LISTAGG(CAST(A.STOREENT_ID AS VARCHAR(32000)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STOREENT_ID,
	        LISTAGG(CAST(A.ATTRTYPE_ID AS VARCHAR(32000)), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRTYPE_ID,
	        LISTAGG(CAST(CEA.ATTR_ID AS VARCHAR(32000)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_ID,
	        LISTAGG(CAST(CEA.SEQUENCE AS VARCHAR(32000)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_SEQUENCE,
	        LISTAGG(CAST(A.IDENTIFIER AS VARCHAR(32000)), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_IDENTIFIER,
	        LISTAGG(COALESCE(A.DISPLAYABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) DISPLAYABLE,
	        LISTAGG(COALESCE(A.SEARCHABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) SEARCHABLE,
	        LISTAGG(COALESCE(A.COMPARABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) COMPARABLE,
	        LISTAGG(COALESCE(A.FACETABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) FACETABLE,
	        LISTAGG(COALESCE(A.MERCHANDISABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) MERCHANDISABLE,
	        LISTAGG(COALESCE(A.SWATCHABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) SWATCHABLE,
               LISTAGG(COALESCE(A.STOREDISPLAY, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STOREDISPLAY,
	        LISTAGG(CAST(COALESCE(AD.NAME, ADF.NAME) AS VARCHAR(32000)), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_NAME,
	        LISTAGG(COALESCE(CAST(COALESCE(AD.GROUPNAME, ADF.GROUPNAME) AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) GROUPNAME,
	        LISTAGG(CAST(V.IDENTIFIER AS VARCHAR(32000)), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_IDENTIFIER,
	        LISTAGG(COALESCE(CAST(COALESCE(VD.STRINGVALUE, VDF.STRINGVALUE) AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STRINGVALUE,
	        LISTAGG(COALESCE(CAST(TO_CHAR(COALESCE(VD.INTEGERVALUE, VDF.INTEGERVALUE)) AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) INTEGERVALUE,
	        LISTAGG(COALESCE(CAST(TO_CHAR(COALESCE(VD.FLOATVALUE, VDF.FLOATVALUE)) AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) FLOATVALUE,
	        LISTAGG(COALESCE(CAST(COALESCE(VD.SEQUENCE, VDF.SEQUENCE) AS VARCHAR(32000)), '0'),', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_SEQUENCE,
	        LISTAGG(COALESCE(CAST(COALESCE(VD.QTYUNIT_ID, VDF.QTYUNIT_ID) AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) QTYUNIT_ID,
	        LISTAGG(COALESCE(CAST(NULLIF(COALESCE(VD.IMAGE1, VDF.IMAGE1),'') AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) IMAGE1,
		LISTAGG(COALESCE(CAST(NULLIF(COALESCE(VD.IMAGE2, VDF.IMAGE2),'') AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) IMAGE2,
	        LISTAGG(CAST(CEA.ATTRVAL_ID AS VARCHAR(32000)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_ID,
	        LISTAGG(COALESCE(CAST(COALESCE(QD.DESCRIPTION, QDF.DESCRIPTION) AS VARCHAR(32000)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) QTY_DESCRIPTION
	    FROM (SELECT DISTINCT CER.CATENTRY_ID_PARENT, CEATTR.SEQUENCE, CEATTR.ATTR_ID, CEATTR.ATTRVAL_ID, CEATTR.USAGE
	           FROM CATENTRYATTR CEATTR,
	                (SELECT A.CATENTRY_ID_PARENT, A.CATENTRY_ID_CHILD
	                   FROM CATENTREL A,
	                        (SELECT G.CATENTRY_ID
	                           FROM CATGPENREL G,CATENTRY E
	                          WHERE G.CATENTRY_ID = E.CATENTRY_ID AND G.CATALOG_ID = ${param.catalogId} AND E.MARKFORDELETE = 0
	                            AND G.CATALOG_ID IN ( SELECT CATALOG_ID FROM STORECAT
	                                                   WHERE STOREENT_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId} ))
	                         ) B,
	                        CATENTRY C
	                  WHERE A.CATENTRY_ID_PARENT=B.CATENTRY_ID AND C.CATENTRY_ID=A.CATENTRY_ID_CHILD AND C.MARKFORDELETE=0 AND A.CATRELTYPE_ID IN ('PRODUCT_ITEM')
	                ) CER
	          WHERE CEATTR.CATENTRY_ID = CER.CATENTRY_ID_CHILD AND CEATTR.ATTRVAL_ID <> 0 AND CEATTR.USAGE = 1) CEA
	          INNER JOIN ATTR A ON (CEA.ATTR_ID = A.ATTR_ID)
	          INNER JOIN ATTRVAL V ON (CEA.ATTRVAL_ID = V.ATTRVAL_ID)
			   ${TI_DELTA_JOIN_QUERY_ROLLUP_ATTR}
	           LEFT OUTER JOIN ATTRDESC AD ON (A.ATTR_ID = AD.ATTR_ID AND AD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN ATTRDESC ADF ON (A.ATTR_ID = ADF.ATTR_ID AND ADF.LANGUAGE_ID = ${default.language})
	           LEFT OUTER JOIN ATTRVALDESC VD ON (V.ATTRVAL_ID = VD.ATTRVAL_ID AND VD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN ATTRVALDESC VDF ON (V.ATTRVAL_ID = VDF.ATTRVAL_ID AND VDF.LANGUAGE_ID = ${default.language})
	           LEFT OUTER JOIN QTYUNITDSC QD ON (VD.QTYUNIT_ID = QD.QTYUNIT_ID AND QD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN QTYUNITDSC QDF ON (VD.QTYUNIT_ID = QDF.QTYUNIT_ID AND QDF.LANGUAGE_ID = ${default.language}) ${extCatentryIdWhereParentOrChild}
	  GROUP BY CEA.CATENTRY_ID_PARENT
      ORDER BY CEA.CATENTRY_ID_PARENT
      LIMIT ${param.offset}, ${param.pageSize}​​

Ensuite, le jeu de résultats est transmis au processeur FindAttributesFromDatabase​​ pour transformation, à l'aide du tableau à l'étape 9 pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit.

Etape 11 : Déplacement vers le bas des propriétés de niveau produit vers ses articles

Cette étape décrit comment les propriétés et les attributs d'une entrée de produit peuvent être envoyés vers tous ses articles enfant dans l'index Produit. Il commence par exécuter la requête Elasticsearch suivante au niveau de l'index Produit :
​
	  {
  "stored_fields": [
    "id.*",
    "identifier.*",
    "relationship.*",
    "attributes.*",
    "natural.descriptive.*",
    "attachments.*",
    "images.*",
    "manufacturer.*"​
​
  ],
  "size": "100",
  "_source": false,
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": [
        {
          "bool": {
            "should": [
              {"term": {"relationship.name": "product"}},
              {"term": {"relationship.name": "variant"}}
             ]
          }
        },
        {
          "term": {
            "id.store": "${param.storeId}"
          }
        },
        {
          "term": {
            "id.catalog": "${param.catalogId}"
          }
        },
        {
          "term": {
            "id.language": "${param.langId}"
          }
        }     
        ${extCatentryES}
	${extDataloadES}​
      ]
    }
  }
}
Ensuite, le jeu de résultats est transmis au processeur PushDownParentProperties pour transformation. La zone de réponse renvoyée à partir de la requête de recherche ci-dessus est mappée dans la zone d'index dans l'index Produit.
  • Les zones de réponse - ​attribute.* et natural.descriptive.* sont mappées à l'aide du tableau ci-dessus à l'étape 9.
  • Les zones de réponse - ​attachments.* et images.* sont mappées à l'aide du tableau ci-dessus à l'étape 7.
  • La zone de réponse - manufacture.*, est mappée à l'aide du tableau ci-dessus à l'étape 1.

Etape 12 : Association d'attributs descriptifs enfant

Cette étape décrit comment les attributs descriptifs d'une entrée enfant peuvent être remplacés et chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit​ depuis la base de données Commerce :​
SELECT CEA.CATENTRY_ID, 
            LISTAGG(CEA.USAGE, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) USAGE,
            LISTAGG(AD.LANGUAGE_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) LANGUAGE_ID,
            LISTAGG(A.STOREENT_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STOREENT_ID,
            LISTAGG(A.ATTRTYPE_ID, '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRTYPE_ID,
            LISTAGG(CEA.ATTR_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_ID,
            LISTAGG(TO_CHAR(COALESCE(CEA.SEQUENCE, 0)), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_SEQUENCE,
            LISTAGG(A.IDENTIFIER, '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_IDENTIFIER, 
            LISTAGG(COALESCE(A.DISPLAYABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) DISPLAYABLE, 
            LISTAGG(COALESCE(A.SEARCHABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) SEARCHABLE, 
            LISTAGG(COALESCE(A.COMPARABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) COMPARABLE, 
            LISTAGG(COALESCE(A.FACETABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) FACETABLE,
            LISTAGG(COALESCE(A.MERCHANDISABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) MERCHANDISABLE, 
            LISTAGG(COALESCE(A.SWATCHABLE, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) SWATCHABLE,
            LISTAGG(COALESCE(A.STOREDISPLAY, 0), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STOREDISPLAY,
            LISTAGG(COALESCE(AD.NAME, ADF.NAME), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTR_NAME, 
            LISTAGG(COALESCE(COALESCE(AD.GROUPNAME, ADF.GROUPNAME), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) GROUPNAME, 
            LISTAGG(V.IDENTIFIER, '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_IDENTIFIER,
            LISTAGG(COALESCE(COALESCE(VD.STRINGVALUE, VDF.STRINGVALUE), ' ' ), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) STRINGVALUE, 
            LISTAGG(COALESCE(TO_CHAR(COALESCE(VD.INTEGERVALUE, VDF.INTEGERVALUE)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) INTEGERVALUE, 
            LISTAGG(COALESCE(TO_CHAR(COALESCE(VD.FLOATVALUE, VDF.FLOATVALUE)), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) FLOATVALUE, 
            LISTAGG(COALESCE(TO_CHAR(COALESCE(VD.SEQUENCE, VDF.SEQUENCE)), '0'), ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_SEQUENCE, 
            LISTAGG(COALESCE(COALESCE(VD.QTYUNIT_ID, VDF.QTYUNIT_ID), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) QTYUNIT_ID,
            LISTAGG(COALESCE(NULLIF(COALESCE(VD.IMAGE1, VDF.IMAGE1), ''), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) IMAGE1,
	    LISTAGG(COALESCE(NULLIF(COALESCE(VD.IMAGE2, VDF.IMAGE2), ''), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) IMAGE2,
            LISTAGG(CEA.ATTRVAL_ID, ', ') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) ATTRVAL_ID,
            LISTAGG(COALESCE(COALESCE(QD.DESCRIPTION, QDF.DESCRIPTION), ' '), '###') WITHIN GROUP (ORDER BY CEA.ATTRVAL_ID) QTY_DESCRIPTION
         FROM (SELECT CER.CATENTRY_ID_CHILD CATENTRY_ID, CEATTR.SEQUENCE, CEATTR.ATTR_ID, CEATTR.ATTRVAL_ID, CEATTR.USAGE
               FROM CATENTRYATTR CEATTR, CATENTREL CATREL,
                    (SELECT A.CATENTRY_ID CATENTRY_ID_PARENT,A.CATENTRY_ID CATENTRY_ID_CHILD 
                       FROM (SELECT G.CATENTRY_ID FROM CATGPENREL G,CATENTRY E 
                              WHERE G.CATENTRY_ID = E.CATENTRY_ID AND G.CATALOG_ID = ${param.catalogId} AND E.MARKFORDELETE = 0 
                                AND G.CATALOG_ID IN (SELECT CATALOG_ID FROM STORECAT
                                                      WHERE STOREENT_ID IN (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId} )) 
                             ) A 
                    ) CER
              WHERE CEATTR.CATENTRY_ID = CER.CATENTRY_ID_PARENT AND CEATTR.ATTRVAL_ID <> 0 
              AND CATREL.CATENTRY_ID_CHILD = CEATTR.CATENTRY_ID AND CATREL.CATRELTYPE_ID = 'PRODUCT_ITEM' AND CEATTR.USAGE = 2
              AND (CER.CATENTRY_ID_PARENT = CER.CATENTRY_ID_CHILD OR 
                    (SELECT COUNT(*) FROM CATENTRYATTR WHERE CATENTRYATTR.CATENTRY_ID = CER.CATENTRY_ID_CHILD AND CEATTR.ATTR_ID = CATENTRYATTR.ATTR_ID) = 0)) CEA
              INNER JOIN ATTR A ON (CEA.ATTR_ID = A.ATTR_ID)
              INNER JOIN ATTRVAL V ON (CEA.ATTRVAL_ID = V.ATTRVAL_ID)
			   ${TI_DELTA_JOIN_QUERY_ATTR}	
               LEFT OUTER JOIN ATTRDESC AD ON (A.ATTR_ID = AD.ATTR_ID AND AD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN ATTRDESC ADF ON (A.ATTR_ID = ADF.ATTR_ID AND ADF.LANGUAGE_ID = ${default.language})
               LEFT OUTER JOIN ATTRVALDESC VD ON (V.ATTRVAL_ID = VD.ATTRVAL_ID AND VD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN ATTRVALDESC VDF ON (V.ATTRVAL_ID = VDF.ATTRVAL_ID AND VDF.LANGUAGE_ID = ${default.language})
               LEFT OUTER JOIN QTYUNITDSC QD ON (VD.QTYUNIT_ID = QD.QTYUNIT_ID AND QD.LANGUAGE_ID = ${param.langId})
               LEFT OUTER JOIN QTYUNITDSC QDF ON (VD.QTYUNIT_ID = QDF.QTYUNIT_ID AND QDF.LANGUAGE_ID = ${default.language}) ${extCatentryWhereSQL}  
       GROUP BY CEA.CATENTRY_ID
       ORDER BY CEA.CATENTRY_ID
  OFFSET ${param.offset} ROWS FETCH NEXT ${param.pageSize} ROWS ONLY      
​
Ensuite, le jeu de résultats est transmis au processeur FindAttributesFro​mDatabase​​ pour transformation, à l'aide du tableau à l'étape 9 pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit.​

Etape 13 : Association des pièces jointes enfant

Cette étape décrit comment les pièces jointes d'une entrée enfant peuvent être remplacés et chargés dans l'index Produit. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Produit depuis la base de données Commerce :
SELECT CE.CATENTRY_ID,
		 LISTAGG(ATCHAST.ATCHAST_ID, ', ') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) ATCHAST_ID,
	         LISTAGG(ATCHTGT.IDENTIFIER, '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) IDENTIFIER,
                 LISTAGG(COALESCE(NULLIF(ATCHRELDSC.NAME,''), ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) NAME,
                 LISTAGG(COALESCE(NULLIF(ATCHRELDSC.SHORTDESCRIPTION,''), ' '), '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) SHORTDESCRIPTION,
		 LISTAGG(COALESCE(ATCHAST.ATCHASTPATH, ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) ATCHASTPATH,
                 LISTAGG(COALESCE(NULLIF(ATCHAST.DIRECTORYPATH,''), ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) DIRECTORYPATH,
                 LISTAGG(COALESCE(NULLIF(ATCHAST.MIMETYPE,''), ' '),  '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) MIMETYPE,
		 LISTAGG(ATCHASTLG.LANGUAGE_ID, ', ') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) LANGUAGE_ID,
		 LISTAGG(COALESCE(ATCHRLUS.IMAGE, ' '), '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) IMAGE,
		 LISTAGG(COALESCE(ATCHRLUS.IDENTIFIER, ' '), '###') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) RULENAME,
		 LISTAGG(TO_CHAR(ATCHREL.SEQUENCE), ', ') WITHIN GROUP (ORDER BY ATCHAST.ATCHAST_ID) SEQUENCE
	  FROM CATENTRY CE
		   ${TI_DELTA_JOIN_QUERY_ATTCH}
	  	   JOIN ATCHREL ON (ATCHREL.BIGINTOBJECT_ID = CE.CATENTRY_ID)
		   JOIN ATCHOBJTYP ON (ATCHREL.ATCHOBJTYP_ID = ATCHOBJTYP.ATCHOBJTYP_ID AND ATCHOBJTYP.IDENTIFIER = 'CATENTRY')
		   LEFT JOIN ATCHTGT ON (ATCHREL.ATCHTGT_ID = ATCHTGT.ATCHTGT_ID )
		   JOIN ATCHAST ON (ATCHAST.ATCHTGT_ID = ATCHTGT.ATCHTGT_ID)
		   LEFT JOIN ATCHASTLG ON (ATCHASTLG.ATCHAST_ID = ATCHAST.ATCHAST_ID) 
		   LEFT JOIN ATCHRELDSC ON (ATCHRELDSC.ATCHREL_ID = ATCHREL.ATCHREL_ID AND ATCHRELDSC.LANGUAGE_ID= ${param.langId})
		   JOIN ATCHRLUS ON (ATCHREL.ATCHRLUS_ID = ATCHRLUS.ATCHRLUS_ID)
	 WHERE (ATCHASTLG.ATCHASTLG_ID IS NULL OR ATCHASTLG.LANGUAGE_ID=${param.langId})
	   AND CE.CATENTRY_ID IN (SELECT C.CATENTRY_ID FROM CATGPENREL R, CATENTRY C
	                           WHERE R.CATALOG_ID = ${param.catalogId} AND R.CATALOG_ID IN
	                                 (SELECT CATALOG_ID FROM STORECAT WHERE STOREENT_ID IN
	                                 (SELECT RELATEDSTORE_ID FROM STOREREL
	                                   WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId}))
	                             AND R.CATENTRY_ID = C.CATENTRY_ID AND C.MARKFORDELETE = 0 AND C.CATENTTYPE_ID = 'ItemBean') ${extCatentryAndSQL1a}
	 GROUP BY CE.CATENTRY_ID

Ensuite, le jeu de résultats est transmis au processeur ​​FindAttachmentsFromDatabase​​ pour transformation, à l'aide du tableau à l'étape 7 pour ​mapper la zone de base de données renvoyée depuis l'instruction SQL ci-dessus vers une zone d'index dans l'index Produit.​

Exemples de mappage de base de données :

Exemples de l'étape 1

Le code suivant est un exemple des données d'entrée pour le processeur CreateProductDocumentFromDatabase :
{
   "CATENTRY_ID":10031,
   "MEMBER_ID":7000000000000001001,
   "CATENTTYPE_ID":"ProductBean     ",
   "PARTNUMBER":"AuroraWMDRS-33",
   "MARKFORDELETE":0,
   "BUYABLE":1,
   "STATE":"1",
   "LANGUAGE_ID":-1,
   "MFPARTNUMBER":null,
   "MFNAME":"Luigi Valenti",
   "STARTDATE":null,
   "ENDDATE":null,
   "NAME":"Luigi Valenti Mid Length Cocktail Dress                                                                                         ",
   "SHORTDESCRIPTION":"Sleeveless cocktail dress with lace work and satin strip at the waist",
   "KEYWORD":null,
   "THUMBNAIL":"images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0037_a_pink.jpg",
   "FULLIMAGE":"images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0037_a_pink.jpg",
   "PUBLISHED":1,
   "CATALOG_ID":10001,
   "CATGROUP_ID":10001,
   "SEQUENCE":31.0,
   "LOCALENAME":"en_US           ",
   "STOREENT_ID":10501
}
Le processeur CreateProductDocumentFromDatabase transforme la base de données d'entrée avec le store id transmis à partir de la classe NiFi FlowFile en tant qu'attribut dans les données de sortie suivantes :
{ "update": { "_id": "1--1-10001-10031", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "buyable": true,
    "identifier": {
      "specification": "product",
      "language": "en_US",
      "sku": {
        "normalized": "AuroraWMDRS-33",
        "raw": "AuroraWMDRS-33"
      },
      "pn": {
        "normalized": "AuroraWMDRS-33",
        "raw": "AuroraWMDRS-33"
      }
    },
    "displayable": true,
    "description": {
      "text_en_US": "Sleeveless cocktail dress with lace work and satin strip at the waist",
      "raw": "Sleeveless cocktail dress with lace work and satin strip at the waist",
      "text": "Sleeveless cocktail dress with lace work and satin strip at the waist"
    },
    "type": "product",
    "url": {
      "image": "images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0037_a_pink.jpg",
      "thumbnail": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0037_a_pink.jpg"
    },
    "__meta": {
      "created": "2020-08-04T01:16:42.012Z",
      "modified": "2020-08-04T01:16:42.034Z",
      "version": {
        "min": 0,
        "max": 0
      }
    },
    "manufacturer": {
      "normalized": "Luigi Valenti",
      "raw": "Luigi Valenti",
      "text": "Luigi Valenti"
    },
    "name": {
      "text_en_US": "Luigi Valenti Mid Length Cocktail Dress",
      "normalized": "Luigi Valenti Mid Length Cocktail Dress",
      "raw": "Luigi Valenti Mid Length Cocktail Dress",
      "text": "Luigi Valenti Mid Length Cocktail Dress"
    },
    "id": {
      "catalog": "10001",
      "member": "7000000000000001001",
      "catentry": "10031",
      "language": "-1",
      "store": [
        "10501",
        "1"
      ]
    },
    "state": true,
    "relationship": {
      "name": "product"
    }
  },
  "doc_as_upsert": true
}

Exemples de l'étape 2

Le code suivant est un exemple des données d'entrée pour le processeur FindOverridesFromDatabase :

{
  "CATENTRY_ID": 10352,
  "LANGUAGE_ID": -1,
  "NAME": "Luigi Valenti Strapless Sundress - Override                                                                                         ",
  "SHORTDESCRIPTION": "Strapless sundress with smoked top and gored skirt - Override",
  "KEYWORD": null,
  "FULLIMAGE": images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_a_blue.jpg,
  "THUMBNAIL": images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_a_blue.jpg​
}
Le processeur FindOverridesFromDatabase transforme les données d'entrée avec le store id, catalog id, language id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les données de sortie suivantes :

{ "update": { "_id": "1--1-10001-10352", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }

{
	"doc": {
		"name": {
			"override": {
				"text_en_US": "Luigi Valenti Strapless Sundress - Override",
				"normalized": "Luigi Valenti Strapless Sundress - Override",
				"raw": "Luigi Valenti Strapless Sundress - Override",
				"text": "Luigi Valenti Strapless Sundress - Override"
			}
		},
		"description": {
			"override": {
				"text_en_US": "Strapless sundress with smoked top and gored skirt - Override",
				"raw": "Strapless sundress with smoked top and gored skirt - Override",
				"text": "Strapless sundress with smoked top and gored skirt - Override"
			}
		},
		"url": {
			"override": {
				"image": "images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_a_blue.jpg",
				"thumbnail": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_a_blue.jpg"
			}
		},
		"__meta": {
			"modified": "2020-08-04T01:28:42.405Z"
		}
	}
}    

Exemples de l'étape 3

Le code suivant est un exemple des données d'entrée pour le processeur FindSubscriptionsFromDatabase.

{
  "CATENTRY_ID": 10378,
  "DISALLOW_REC_ORDER": 1,
  "SUBSCPTYPE_ID": "NONE                            "
}
FindSubscriptionsFromDatabase transforme les données d'entrée avec le store id, language id et catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les données de sortie suivantes :

{ "update": { "_id": "1--1-10001-10378", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "subscription": {
      "recurring": false,
      "type": "NONE"
    },
    "__meta": {
      "modified": "2020-08-04T01:38:24.368Z"
    }
  }
}

Exemples de l'étape 4

Le code suivant est un exemple des données d'entrée pour le processeur FindChildItemsFromDatabase :

{
  "CATENTRY_ID_PARENT": 12361,
  "CATENTRY_ID_CHILD": "12362, 12363, 12364, 12365, 12366, 3074457345616681168, 3074457345616681169",
  "SEQUENCE": "1, 2, 3, 4, 5, 1, 2",
  "CATALOG_ID": "10001###10502###10001###10502###10001###10502###10001",
  "CATRELTYPE_ID": "PRODUCT_ITEM###PRODUCT_ITEM###PRODUCT_ITEM###PRODUCT_ITEM###PRODUCT_ITEM###PRODUCT_VARIANT###PRODUCT_VARIANT",  
  "COMPONENT_ID": null,
  "QUANTITY": null
}
Le processeur FindChildItemsFromDatabase transforme les données d'entrée avec store id, language id, catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les données de sortie suivantes :

{ "update": { "_id": "1--1-10001-12361", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "relationship": {
      "item": {
        "sequence": [
          1,
          2,
          3,
          4,
          5
        ],
        "id": [
          "12362",
          "12363",
          "12364",
          "12365",
          "12366"
        ]
      },
      "variant": {
        "sequence": [
          1,
          2
        ],
        "id": [
          "3074457345616681168",
          "3074457345616681169"
        ]
      }
    },
    "__meta": {
      "modified": "2020-08-04T01:45:28.668Z"
    }
  }
}

Exemples de l'étape 5

Le code suivant est un exemple des données d'entrée pour le processeur FindEntitlementsFromDatabase :

{
  "CATENTRY_ID": 13040,
  "PRODUCTSET_ID": 10001
}
Le processeur FindEntitlementsFromDatacase transforme les données d'entrée avec store id, language id et catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie suivantes :

{ "update": { "_id": "1--1-10001-13040", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "relationship": {
      "set": "10001"
    },
    "__meta": {
      "modified": "2020-08-04T01:54:15.517Z"
    }
  }
}

Exemples de l'étape 6

Le code suivant est un exemple des données d'entrée pour le processeur FindAssociationsFromDatabase.

{
  "CATENTRY_ID_FROM": 10001,
  "CATENTRY_ID_TO": "10003, 10009, 10011",
  "RANK": "1, 2, 3",
  "TYPE": "ACCESSORY###ACCESSORY###ACCESSORY",
  "QUANTITY": "10, 2, 5",
}
Le processeur FindAssociationsFromDatabase transforme les données d'entrée avec store id, language id, catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie suivantes :

{ "update": { "_id": "1--1-10001-10001", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "associations": [
      {
        "quantity": 10,
        "rank": 1,
        "id": "10003",
        "type": "ACCESSORY"
      },
      {
        "quantity": 2,
        "rank": 2,
        "id": "10009",
        "type": "ACCESSORY"
      },
      {
        "quantity": 5,
        "rank": 3,
        "id": "10011",
        "type": "ACCESSORY"
      }
    ],
    "__meta": {
      "modified": "2020-08-04T02:03:01.436Z"
    }
  }
}

Exemples de l'étape 7

Le code suivant est un exemple des données d'entrée pour le processeur FindAttachmentsFromDatabase :

{
  "CATENTRY_ID": 10350,
  "ATCHAST_ID": "2231, 2233, 2232, 2234",
  "IDENTIFIER": "Dress Angle 1 20201 thumbnail image###Dress Angle 1 20201 full size image###Dress Angle 2 20201 thumbnail image###Dress Angle 2 20201 full size image",
  "NAME": "Luigi Valenti Strapless Sundress Angle 1###Luigi Valenti Strapless Sundress Angle 1###Luigi Valenti Strapless Sundress Angle 2###Luigi Valenti Strapless Sundress Angle 2",
  "SHORTDESCRIPTION": "Luigi Valenti Strapless Sundress Angle 1###Luigi Valenti Strapless Sundress Angle 1###Luigi Valenti Strapless Sundress Angle 2###Luigi Valenti Strapless Sundress Angle 2",
  "ATCHASTPATH": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_a_blue.jpg###images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_a_blue.jpg###images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_b_blue.jpg###images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_b_blue.jpg",
  "DIRECTORYPATH": "images/catalog/apparel/women/###images/catalog/apparel/women/###images/catalog/apparel/women/###images/catalog/apparel/women/",
  "MIMETYPE": "image/jpg###image/jpg###image/jpg###image/jpg",
  "LANGUAGE_ID": null,
  "IMAGE": " ### ### ### ",
  "RULENAME": "ANGLEIMAGES_THUMBNAIL###ANGLEIMAGES_FULLIMAGE###ANGLEIMAGES_THUMBNAIL###ANGLEIMAGES_FULLIMAGE",
  "SEQUENCE": "1, 1, 2, 2"
}

Le processeur FindAttachmentsFromDatabase transforme les données d'entrée avec store id, language id et catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie suivantes :


{ "update": { "_id": "1--1-10001-10012", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }

{
	"doc": {
		"attachments": [
			{
				"identifier": "Dress Angle 1 20201 thumbnail image",
				"sequence": 1.0,
				"name.raw": "Luigi Valenti Strapless Sundress Angle 1",
				"description.raw": "Luigi Valenti Strapless Sundress Angle 1",
				"mime": "image/jpg",
				"rule": "ANGLEIMAGES_THUMBNAIL",
				"id": "2231",
				"url": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_a_blue.jpg"
			},
			{
				"identifier": "Dress Angle 2 20201 thumbnail image",
				"sequence": 2.0,
				"name.raw": "Luigi Valenti Strapless Sundress Angle 2",
				"description.raw": "Luigi Valenti Strapless Sundress Angle 2",
				"mime": "image/jpg",
				"rule": "ANGLEIMAGES_THUMBNAIL",
				"id": "2232",
				"url": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_b_blue.jpg"
			},
			{
				"identifier": "Dress Angle 1 20201 full size image",
				"sequence": 1.0,
				"name.raw": "Luigi Valenti Strapless Sundress Angle 1",
				"description.raw": "Luigi Valenti Strapless Sundress Angle 1",
				"mime": "image/jpg",
				"rule": "ANGLEIMAGES_FULLIMAGE",
				"id": "2233",
				"url": "images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_a_blue.jpg"
			},
			{
				"identifier": "Dress Angle 2 20201 full size image",
				"sequence": 2.0,
				"name.raw": "Luigi Valenti Strapless Sundress Angle 2",
				"description.raw": "Luigi Valenti Strapless Sundress Angle 2",
				"mime": "image/jpg",
				"rule": "ANGLEIMAGES_FULLIMAGE",
				"id": "2234",
				"url": "images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_b_blue.jpg"
			}
		],
		"images": [
			{
				"sequence": 1.0,
				"image": "images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_a_blue.jpg",
				"thumbnail": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_a_blue.jpg",
				"name": "Luigi Valenti Strapless Sundress Angle 1"
			},
			{
				"sequence": 2.0,
				"image": "images/catalog/apparel/women/wcl000_dresses/646x1000/wcl000_0011_b_blue.jpg",
				"thumbnail": "images/catalog/apparel/women/wcl000_dresses/200x310/wcl000_0011_b_blue.jpg",
				"name": "Luigi Valenti Strapless Sundress Angle 2"
			}
		],
		"__meta": {
			"modified": "2020-08-04T02:20:04.268Z"
		}
	}
}

Exemples de l'étape 8

Le code suivant est un exemple des données d'entrée pour le processeur FindParentCategoryFromDatabase.

{
  "CATENTRY_ID": 10001,
  "LANGUAGE_ID": -1,
  "NAME": "Hermitage Fit and Flare Dress-Override                                                                                          ",
  "SHORTDESCRIPTION": "Jewel-toned cocktail dress with fitted bodice and gently flared skirt-Override",
  "KEYWORD": null,
  "FULLIMAGE": null,
  "THUMBNAIL": null,
  "LOCALENAME": "en_US"
}
Le processeur FindParentCategoryFromDatabase transforme les données d'entrée avec le store id, language id, catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie suivantes :

{ "update": { "_id": "1--1-10001-10001", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
	"doc": {
		"category": {
			"10502-1-3-10001": {
				"parent": "10001",
				"sequence": "1",
				"catalog": "10502",
				"path": {
					"name": [
						"Apparel",
						"Women",
						"Dresses"
					],
					"id": [
						"1",
						"3",
						"10001"
					]
				},
				"name": "Dresses"
			}
		},
		"path": {
			"10502": [
				"/1/3/10001"
			]
		}
	},
	"doc_as_upsert": true
}​

Exemples de l'étape 9

Le code suivant est un exemple des données d'entrée pour le cumul pour le processeur FindAttributesFromDatabase :

{
  "CATENTRY_ID" : 10579,
  "USAGE" : "1, 1",
  "LANGUAGE_ID" : "-1, -1",
  "STOREENT_ID" : "10501, 10501",
  "ATTRTYPE_ID" : "STRING          ###STRING          ",
  "ATTR_ID" : "7000000000000000001, 7000000000000000002",
  "DISPLAY_SEQUENCE" : "1, 1",
  "ATTR_IDENTIFIER" : "swatchSize###swatchcolor",
  "ATTR_SEQUENCE" : "0, 0",
  "DISPLAYABLE" : "1, 1",
  "SEARCHABLE" : "0, 0",
  "COMPARABLE" : "1, 1",
  "FACETABLE" : "0, 0",
  "MERCHANDISABLE" : "0, 0",
  "SWATCHABLE" : "0, 0",
  "ATTR_NAME" : "Available Sizes###Color",
  "GROUPNAME" : " ### ",
  "ATTRVAL_IDENTIFIER" : "S###Silver",
  "STRINGVALUE" : "S###Silver",
  "INTEGERVALUE" : " ### ",
  "FLOATVALUE" : " ### ",
  "ATTRVAL_SEQUENCE" : "1, 1",
  "QTYUNIT_ID" : "C62             ###C62             ",
  "IMAGE1" : "images/catalog/apparel/women/Swatches/swatch_size/size_s_enabled.png###images/catalog/apparel/women/Swatches/swatch_silver.png",
  "IMAGE2" : " ### ",
  "ATTRVAL_ID" : "7000000000000000001, 7000000000000000015",
  "QTY_DESCRIPTION" : "one###one"
}
Le processeur FindAttributesFromDatabase transforme les données d'entrée avec store id, language id, catalog id transmis à partir de la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie suivantes :

{ "update": { "_id": "1--1-10001-10579", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "attributes": {
      "swatchcolor": {
        "identifier": "swatchcolor",
        "usage": "Defining",
        "displayable": true,
        "merchandisable": false,
        "searchable": false,
        "sequence": 0,
        "name": {
          "normalized": "Color",
          "raw": "Color",
          "text": "Color"
        },
        "facetable": false,
        "id": "7000000000000000002",
        "comparable": true,
        "value": [
          {
            "identifier": "Silver",
            "sequence": 1,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "Silver",
            "raw": "Silver",
            "id": "7000000000000000015",
            "image1": "images/catalog/apparel/women/Swatches/swatch_silver.png"
          }
        ],
        "key": "swatchcolor",
        "swatchable": false
      },
      "swatchsize": {
        "identifier": "swatchSize",
        "usage": "Defining",
        "displayable": true,
        "merchandisable": false,
        "searchable": false,
        "sequence": 0,
        "name": {
          "normalized": "Available Sizes",
          "raw": "Available Sizes",
          "text": "Available Sizes"
        },
        "facetable": false,
        "id": "7000000000000000001",
        "comparable": true,
        "value": [
          {
            "identifier": "S",
            "sequence": 1,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "S",
            "raw": "S",
            "id": "7000000000000000001",
            "image1": "images/catalog/apparel/women/Swatches/swatch_size/size_s_enabled.png"
          }
        ],
        "key": "swatchsize",
        "swatchable": false
      }
    },
    "__meta": {
      "modified": "2020-08-04T02:30:16.091Z"
    }
  }
}

Exemples de l'étape 10

Le code suivant est un exemple des données d'entrée pour le processeur FindAttributesFromDatabase.
{
  "CATENTRY_ID": 13296,
  "USAGE": "1, 1, 1, 1, 1, 1, 1",
  "LANGUAGE_ID": "-1, -1, -1, -1, -1, -1, -1",
  "STOREENT_ID": "10501, 10501, 10501, 10501, 10501, 10501, 10501",
  "ATTRTYPE_ID": "STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ###STRING          ",
  "ATTR_ID": "7000000000000000138, 7000000000000000142, 7000000000000000142, 7000000000000000142, 7000000000000000141, 7000000000000000141, 7000000000000000141",
  "DISPLAY_SEQUENCE": "0E0, 1.0E0, 1.0E0, 1.0E0, 2.0E0, 2.0E0, 2.0E0",
  "ATTR_IDENTIFIER": "hardware_fasteners_boltsThread size###hardware_fasteners_boltsMaterial###hardware_fasteners_boltsMaterial###hardware_fasteners_boltsMaterial###hardware_fasteners_boltsLength###hardware_fasteners_boltsLength###hardware_fasteners_boltsLength",
  "ATTR_SEQUENCE": "0E0, 0E0, 0E0, 0E0, 0E0, 0E0, 0E0",
  "DISPLAYABLE": "1, 1, 1, 1, 1, 1, 1",
  "SEARCHABLE": "0, 0, 0, 0, 0, 0, 0",
  "COMPARABLE": "1, 1, 1, 1, 1, 1, 1",
  "FACETABLE": "0, 0, 0, 0, 0, 0, 0",
  "MERCHANDISABLE": "0, 0, 0, 0, 0, 0, 0",
  "SWATCHABLE": "0, 0, 0, 0, 0, 0, 0",
  "ATTR_NAME": "Thread size###Material###Material###Material###Length###Length###Length",
  "GROUPNAME": " ### ### ### ### ### ### ",
  "ATTRVAL_IDENTIFIER": "3/4\"-10###Stainless steel###Alloy steel###Brass###2\"###2 1/4\"###3\"",
  "STRINGVALUE": "3/4\"-10###Stainless steel###Alloy steel###Brass###2\"###2 1/4\"###3\"",
  "INTEGERVALUE": " ### ### ### ### ### ### ",
  "FLOATVALUE": " ### ### ### ### ### ### ",
  "ATTRVAL_SEQUENCE": "0E0, 1.0E0, 1.0E0, 1.0E0, 2.0E0, 2.0E0, 2.0E0",
  "QTYUNIT_ID": "C62             ###C62             ###C62             ###C62             ###C62             ###C62             ###C62             ",
  "IMAGE1": " ### ### ### ### ### ### ",
  "IMAGE2": " ### ### ### ### ### ### ",
  "ATTRVAL_ID": "7000000000000002590, 7000000000000002612, 7000000000000002613, 7000000000000002614, 7000000000000002607, 7000000000000002608, 7000000000000002609",
  "QTY_DESCRIPTION": "one###one###one###one###one###one###one"
}   
      
Le processeur FindAttributesFromDatabase transforme les données d'entrée avec l'ID de magasin, l'ID de langue et l'ID de catalogue transmis depuis la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie comme suit :
{ "update": { "_id": "1--1-10001-13296", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "attributes": {
      "hardware_fasteners_boltslength": {
        "identifier": "hardware_fasteners_boltsLength",
        "usage": "Defining",
        "displayable": true,
        "merchandisable": false,
        "searchable": false,
        "sequence": 0,
        "name": {
          "normalized": "Length",
          "raw": "Length",
          "text": "Length"
        },
        "facetable": false,
        "id": "7000000000000000141",
        "comparable": true,
        "value": [
          {
            "identifier": "2\"",
            "sequence": 2,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "2\"",
            "raw": "2\"",
            "id": "7000000000000002607"
          },
          {
            "identifier": "2 1/4\"",
            "sequence": 2,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "2 1/4\"",
            "raw": "2 1/4\"",
            "id": "7000000000000002608"
          },
          {
            "identifier": "3\"",
            "sequence": 2,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "3\"",
            "raw": "3\"",
            "id": "7000000000000002609"
          }
        ],
        "key": "hardware_fasteners_boltslength",
        "swatchable": false
      },
      "hardware_fasteners_boltsthreadsize": {
        "identifier": "hardware_fasteners_boltsThread size",
        "usage": "Defining",
        "displayable": true,
        "merchandisable": false,
        "searchable": false,
        "sequence": 0,
        "name": {
          "normalized": "Thread size",
          "raw": "Thread size",
          "text": "Thread size"
        },
        "facetable": false,
        "id": "7000000000000000138",
        "comparable": true,
        "value": [
          {
            "identifier": "3/4\"-10",
            "sequence": 0,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "3/4\"-10",
            "raw": "3/4\"-10",
            "id": "7000000000000002590"
          }
        ],
        "key": "hardware_fasteners_boltsthreadsize",
        "swatchable": false
      },
      "hardware_fasteners_boltsmaterial": {
        "identifier": "hardware_fasteners_boltsMaterial",
        "usage": "Defining",
        "displayable": true,
        "merchandisable": false,
        "searchable": false,
        "sequence": 0,
        "name": {
          "normalized": "Material",
          "raw": "Material",
          "text": "Material"
        },
        "facetable": false,
        "id": "7000000000000000142",
        "comparable": true,
        "value": [
          {
            "identifier": "Stainless steel",
            "sequence": 1,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "Stainless steel",
            "raw": "Stainless steel",
            "id": "7000000000000002612"
          },
          {
            "identifier": "Alloy steel",
            "sequence": 1,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "Alloy steel",
            "raw": "Alloy steel",
            "id": "7000000000000002613"
          },
          {
            "identifier": "Brass",
            "sequence": 1,
            "unit": {
              "identifier": "C62",
              "name": {
                "raw": "one"
              }
            },
            "normalized": "Brass",
            "raw": "Brass",
            "id": "7000000000000002614"
          }
        ],
        "key": "hardware_fasteners_boltsmaterial",
        "swatchable": false
      }
    },
    "__meta": {
      "modified": "2020-08-04T02:55:52.644Z"
    }
  }
}

Exemples de l'étape 11

Le code suivant est un exemple des données d'entrée pour le processeur PushDownParentProperties :

{
  "_index": ".auth.1.product.202007021505",
  "_type": "_doc",
  "_id": "1--1-10001-11062",
  "_score": 1,
  "fields": {
    "id.catentry": [
      "11062"
    ],
    "attributes.shape.merchandisable": [
      false
    ],
    "attributes.material.displayable": [
      true
    ],
    "attributes.style.sequence": [
      0
    ],
    "attributes.womenskirtssize.value.unit.identifier": [
      "C62",
      "C62",
      "C62",
      "C62",
      "C62",
      "C62",
      "C62"
    ],
    "attributes.length.value.raw": [
      "Mini cut length"
    ],
    "attributes.occasion.name.normalized": [
      "occasion"
    ],
    "attributes.style.value.identifier": [
      "WCL003_0303"
    ],
    "attributes.material.value.sequence": [
      3
    ],
    "attributes.length.value.id": [
      "7000000000000000369"
    ],
    "attributes.style.value.sequence": [
      1
    ],
    "attributes.cleaning.value.raw": [
      "Machine wash"
    ],
    "id.store": [
      "10501",
      "1"
    ],
    "attributes.womenskirtscolor.value.identifier": [
      "Green"
    ],
    "attributes.cleaning.sequence": [
      11
    ],
    "attributes.length.usage": [
      "Descriptive"
    ],
    "attributes.womenskirtssize.usage": [
      "Defining"
    ],
    "attributes.womenskirtscolor.usage": [
      "Defining"
    ],
    "attributes.womenskirtscolor.name.normalized": [
      "color"
    ],
    "attributes.womenskirtssize.value.identifier": [
      "XS",
      "S",
      "M",
      "L",
      "XL",
      "XXL",
      "XXXL"
    ],
    "attributes.style.identifier": [
      "Style"
    ],
    "attributes.occasion.value.identifier": [
      "WCL003_0303"
    ],
    "attributes.womenskirtscolor.value.unit.identifier": [
      "C62"
    ],
    "attributes.style.merchandisable": [
      false
    ],
    "attributes.length.name.normalized": [
      "length"
    ],
    "attributes.cleaning.value.text": [
      "Machine wash"
    ],
    "attributes.length.value.sequence": [
      2
    ],
    "id.catalog": [
      "10001"
    ],
    "attributes.womenskirtssize.value.id": [
      "7000000000000000316",
      "7000000000000000317",
      "7000000000000000318",
      "7000000000000000319",
      "7000000000000000320",
      "7000000000000000321",
      "7000000000000000322"
    ],
    "attributes.length.key": [
      "length"
    ],
    "attributes.length.name.text": [
      "Length"
    ],
    "attributes.occasion.value.id": [
      "7000000000000000384"
    ],
    "attributes.material.searchable": [
      false
    ],
    "attributes.length.displayable": [
      true
    ],
    "attributes.womenskirtssize.name.text": [
      "Size"
    ],
    "attributes.shape.facetable": [
      false
    ],
    "attributes.material.usage": [
      "Descriptive"
    ],
    "attributes.shape.comparable": [
      true
    ],
    "attributes.cleaning.searchable": [
      true
    ],
    "attributes.womenskirtscolor.sequence": [
      0
    ],
    "attributes.womenskirtssize.searchable": [
      false
    ],
    "attributes.length.facetable": [
      false
    ],
    "attributes.style.value.normalized": [
      "pull on"
    ],
    "attributes.womenskirtscolor.value.normalized": [
      "green"
    ],
    "attributes.occasion.comparable": [
      true
    ],
    "id.language": [
      "-1"
    ],
    "attributes.style.comparable": [
      true
    ],
    "attributes.shape.displayable": [
      true
    ],
    "attributes.style.id": [
      "7000000000000000010"
    ],
    "attributes.shape.value.sequence": [
      0
    ],
    "attributes.length.name.raw": [
      "Length"
    ],
    "attributes.shape.identifier": [
      "Shape"
    ],
    "attributes.style.name.raw": [
      "Style"
    ],
    "attributes.cleaning.facetable": [
      true
    ],
    "attributes.womenskirtscolor.name.text": [
      "Color"
    ],
    "attributes.occasion.name.text": [
      "Occasion"
    ],
    "attributes.material.swatchable": [
      false
    ],
    "attributes.womenskirtssize.swatchable": [
      false
    ],
    "attributes.style.facetable": [
      false
    ],
    "attributes.length.value.normalized": [
      "mini cut length"
    ],
    "attributes.womenskirtssize.name.raw": [
      "Size"
    ],
    "attributes.occasion.name.raw": [
      "Occasion"
    ],
    "attributes.womenskirtscolor.value.raw": [
      "Green"
    ],
    "attributes.womenskirtssize.value.unit.name.raw": [
      "one",
      "one",
      "one",
      "one",
      "one",
      "one",
      "one"
    ],
    "attributes.length.value.identifier": [
      "WCL003_0303"
    ],
    "attributes.womenskirtssize.merchandisable": [
      false
    ],
    "attributes.cleaning.swatchable": [
      false
    ],
    "attributes.womenskirtscolor.comparable": [
      true
    ],
    "attributes.womenskirtssize.value.raw": [
      "XS",
      "S",
      "M",
      "L",
      "XL",
      "XXL",
      "XXXL"
    ],
    "attributes.occasion.value.sequence": [
      4
    ],
    "attributes.womenskirtscolor.displayable": [
      true
    ],
    "attributes.cleaning.usage": [
      "Descriptive"
    ],
    "attributes.material.sequence": [
      0
    ],
    "attributes.shape.sequence": [
      0
    ],
    "attributes.material.facetable": [
      false
    ],
    "attributes.material.key": [
      "material"
    ],
    "attributes.length.sequence": [
      0
    ],
    "attributes.womenskirtscolor.searchable": [
      false
    ],
    "attributes.cleaning.identifier": [
      "Cleaning"
    ],
    "attributes.womenskirtssize.value.normalized": [
      "xs",
      "s",
      "m",
      "l",
      "xl",
      "xxl",
      "xxxl"
    ],
    "attributes.womenskirtssize.displayable": [
      true
    ],
    "attributes.womenskirtscolor.swatchable": [
      false
    ],
    "attributes.cleaning.name.raw": [
      "Cleaning"
    ],
    "attributes.womenskirtscolor.merchandisable": [
      false
    ],
    "attributes.shape.searchable": [
      false
    ],
    "attributes.cleaning.comparable": [
      true
    ],
    "attributes.shape.usage": [
      "Descriptive"
    ],
    "attributes.cleaning.key": [
      "cleaning"
    ],
    "attributes.cleaning.value.id": [
      "7000000000000000324"
    ],
    "attributes.womenskirtssize.facetable": [
      false
    ],
    "attributes.womenskirtssize.identifier": [
      "WomenSkirtsSize"
    ],
    "attributes.cleaning.id": [
      "7000000000000000021"
    ],
    "attributes.cleaning.displayable": [
      true
    ],
    "attributes.style.value.id": [
      "7000000000000000356"
    ],
    "attributes.style.displayable": [
      true
    ],
    "attributes.length.comparable": [
      true
    ],
    "attributes.shape.name.normalized": [
      "shape"
    ],
    "attributes.length.id": [
      "7000000000000000025"
    ],
    "attributes.material.id": [
      "7000000000000000009"
    ],
    "attributes.womenskirtssize.name.normalized": [
      "size"
    ],
    "attributes.occasion.value.raw": [
      "Casual"
    ],
    "attributes.length.identifier": [
      "Length"
    ],
    "attributes.womenskirtscolor.id": [
      "7000000000000000023"
    ],
    "attributes.occasion.identifier": [
      "Occasion"
    ],
    "attributes.occasion.sequence": [
      0
    ],
    "relationship.item.id": [
      "11063",
      "11064"
    ],
    "relationship.variant.id": [
      "3074457345616681168",
      "3074457345616681169"
    ],
    "relationship.variant.sequence": [
      "100.00",
      "200.00"
    ],    
    "attributes.shape.name.raw": [
      "Shape"
    ],
    "attributes.style.key": [
      "style"
    ],
    "attributes.shape.key": [
      "shape"
    ],
    "attributes.style.searchable": [
      false
    ],
    "attributes.womenskirtscolor.value.sequence": [
      0
    ],
    "attributes.womenskirtssize.id": [
      "7000000000000000024"
    ],
    "attributes.length.searchable": [
      false
    ],
    "attributes.cleaning.value.sequence": [
      6
    ],
    "attributes.womenskirtscolor.key": [
      "womenskirtscolor"
    ],
    "attributes.material.identifier": [
      "Material"
    ],
    "relationship.item.sequence": [
      1,
      2
    ],
    "attributes.material.name.raw": [
      "Material"
    ],
    "attributes.womenskirtssize.comparable": [
      true
    ],
    "attributes.occasion.value.normalized": [
      "casual"
    ],
    "attributes.womenskirtssize.sequence": [
      0
    ],
    "attributes.shape.value.id": [
      "7000000000000000402"
    ],
    "relationship.name": [
      "product"
    ],
    "attributes.cleaning.name.normalized": [
      "cleaning"
    ],
    "attributes.womenskirtscolor.identifier": [
      "WomenSkirtsColor"
    ],
    "attributes.material.comparable": [
      true
    ],
    "attributes.occasion.displayable": [
      true
    ],
    "attributes.style.value.raw": [
      "Pull on"
    ],
    "attributes.occasion.id": [
      "7000000000000000011"
    ],
    "attributes.womenskirtscolor.value.id": [
      "7000000000000000311"
    ],
    "attributes.shape.value.identifier": [
      "WCL003_0303"
    ],
    "attributes.material.merchandisable": [
      false
    ],
    "attributes.style.usage": [
      "Descriptive"
    ],
    "attributes.shape.id": [
      "7000000000000000026"
    ],
    "attributes.occasion.searchable": [
      false
    ],
    "attributes.length.merchandisable": [
      false
    ],
    "attributes.occasion.merchandisable": [
      false
    ],
    "attributes.womenskirtscolor.facetable": [
      false
    ],
    "attributes.cleaning.merchandisable": [
      false
    ],
    "attributes.material.value.raw": [
      "Cotton"
    ],
    "attributes.womenskirtssize.value.sequence": [
      1,
      1,
      1,
      1,
      1,
      1,
      1
    ],
    "attributes.womenskirtscolor.value.unit.name.raw": [
      "one"
    ],
    "attributes.womenskirtscolor.name.raw": [
      "Color"
    ],
    "id.member": [
      "7000000000000001001"
    ],
    "attributes.occasion.key": [
      "occasion"
    ],
    "attributes.material.value.id": [
      "7000000000000000341"
    ],
    "attributes.style.name.normalized": [
      "style"
    ],
    "attributes.shape.swatchable": [
      false
    ],
    "attributes.shape.value.raw": [
      "Flocked"
    ],
    "attributes.womenskirtssize.key": [
      "womenskirtssize"
    ],
    "attributes.material.value.normalized": [
      "cotton"
    ],
    "attributes.material.name.text": [
      "Material"
    ],
    "attributes.occasion.usage": [
      "Descriptive"
    ],
    "attributes.cleaning.value.normalized": [
      "machine wash"
    ],
    "attributes.style.swatchable": [
      false
    ],
    "attributes.material.value.identifier": [
      "WCL003_0303"
    ],
    "attributes.cleaning.name.text": [
      "Cleaning"
    ],
    "attributes.shape.name.text": [
      "Shape"
    ],
    "attributes.shape.value.normalized": [
      "flocked"
    ],
    "attributes.occasion.facetable": [
      false
    ],
    "attributes.occasion.swatchable": [
      false
    ],
    "attributes.material.name.normalized": [
      "material"
    ],
    "attributes.style.name.text": [
      "Style"
    ],
    "attributes.cleaning.value.identifier": [
      "WCL003_0303"
    ],
    "attributes.length.swatchable": [
      false
    ]
  }
}
Le processeur PushDownParentProperties transforme les données d'entrée en exemples de données de sortie suivants :
{ "update": { "_id": "1--1-10001-11063", "_index": ".auth.1.product.202007021505", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"attributes":{"occasion":{"identifier":"Occasion","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"occasion","raw":"Occasion","text":"Occasion"},"facetable":false,"id":"7000000000000000011","value":{"identifier":"WCL003_0303","sequence":4,"normalized":"casual","raw":"Casual","id":"7000000000000000384"},"comparable":true,"key":"occasion","swatchable":false},"cleaning":{"identifier":"Cleaning","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":true,"sequence":11,"name":{"normalized":"cleaning","raw":"Cleaning","text":"Cleaning"},"facetable":true,"id":"7000000000000000021","value":{"sequence":6,"identifier":"WCL003_0303","normalized":"machine wash","raw":"Machine wash","text":"Machine wash","id":"7000000000000000324"},"comparable":true,"key":"cleaning","swatchable":false},"shape":{"identifier":"Shape","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"shape","raw":"Shape","text":"Shape"},"facetable":false,"id":"7000000000000000026","comparable":true,"value":{"sequence":0,"identifier":"WCL003_0303","normalized":"flocked","raw":"Flocked","id":"7000000000000000402"},"key":"shape","swatchable":false},"material":{"identifier":"Material","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"material","raw":"Material","text":"Material"},"facetable":false,"id":"7000000000000000009","value":{"sequence":3,"identifier":"WCL003_0303","normalized":"cotton","raw":"Cotton","id":"7000000000000000341"},"comparable":true,"key":"material","swatchable":false},"length":{"identifier":"Length","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"length","raw":"Length","text":"Length"},"facetable":false,"id":"7000000000000000025","value":{"sequence":2,"identifier":"WCL003_0303","normalized":"mini cut length","raw":"Mini cut length","id":"7000000000000000369"},"comparable":true,"key":"length","swatchable":false},"style":{"identifier":"Style","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"style","raw":"Style","text":"Style"},"facetable":false,"id":"7000000000000000010","value":{"identifier":"WCL003_0303","sequence":1,"normalized":"pull on","raw":"Pull on","id":"7000000000000000356"},"comparable":true,"key":"style","swatchable":false}},"relationship":{"product":{"sequence":[1.0],"id":["11062"]}},"__meta":{"modified":"2020-08-04T03:08:32.521Z"}} }
{ "update": { "_id": "1--1-10001-11064", "_index": ".auth.1.product.202007021505", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"attributes":{"occasion":{"identifier":"Occasion","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"occasion","raw":"Occasion","text":"Occasion"},"facetable":false,"id":"7000000000000000011","value":{"identifier":"WCL003_0303","sequence":4,"normalized":"casual","raw":"Casual","id":"7000000000000000384"},"comparable":true,"key":"occasion","swatchable":false},"cleaning":{"identifier":"Cleaning","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":true,"sequence":11,"name":{"normalized":"cleaning","raw":"Cleaning","text":"Cleaning"},"facetable":true,"id":"7000000000000000021","value":{"sequence":6,"identifier":"WCL003_0303","normalized":"machine wash","raw":"Machine wash","text":"Machine wash","id":"7000000000000000324"},"comparable":true,"key":"cleaning","swatchable":false},"shape":{"identifier":"Shape","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"shape","raw":"Shape","text":"Shape"},"facetable":false,"id":"7000000000000000026","comparable":true,"value":{"sequence":0,"identifier":"WCL003_0303","normalized":"flocked","raw":"Flocked","id":"7000000000000000402"},"key":"shape","swatchable":false},"material":{"identifier":"Material","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"material","raw":"Material","text":"Material"},"facetable":false,"id":"7000000000000000009","value":{"sequence":3,"identifier":"WCL003_0303","normalized":"cotton","raw":"Cotton","id":"7000000000000000341"},"comparable":true,"key":"material","swatchable":false},"length":{"identifier":"Length","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"length","raw":"Length","text":"Length"},"facetable":false,"id":"7000000000000000025","value":{"sequence":2,"identifier":"WCL003_0303","normalized":"mini cut length","raw":"Mini cut length","id":"7000000000000000369"},"comparable":true,"key":"length","swatchable":false},"style":{"identifier":"Style","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"style","raw":"Style","text":"Style"},"facetable":false,"id":"7000000000000000010","value":{"identifier":"WCL003_0303","sequence":1,"normalized":"pull on","raw":"Pull on","id":"7000000000000000356"},"comparable":true,"key":"style","swatchable":false}},"relationship":{"product":{"sequence":[2.0],"id":["11062"]}},"__meta":{"modified":"2020-08-04T03:08:33.071Z"}} }
{ "update": { "_id": "1--1-10001-3074457345616681168", "_index": ".auth.1.product.202007021505", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"attributes":{"occasion":{"identifier":"Occasion","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"occasion","raw":"Occasion","text":"Occasion"},"facetable":false,"id":"7000000000000000011","value":{"identifier":"WCL003_0303","sequence":4,"normalized":"casual","raw":"Casual","id":"7000000000000000384"},"comparable":true,"key":"occasion","swatchable":false},"cleaning":{"identifier":"Cleaning","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":true,"sequence":11,"name":{"normalized":"cleaning","raw":"Cleaning","text":"Cleaning"},"facetable":true,"id":"7000000000000000021","value":{"sequence":6,"identifier":"WCL003_0303","normalized":"machine wash","raw":"Machine wash","text":"Machine wash","id":"7000000000000000324"},"comparable":true,"key":"cleaning","swatchable":false},"shape":{"identifier":"Shape","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"shape","raw":"Shape","text":"Shape"},"facetable":false,"id":"7000000000000000026","comparable":true,"value":{"sequence":0,"identifier":"WCL003_0303","normalized":"flocked","raw":"Flocked","id":"7000000000000000402"},"key":"shape","swatchable":false},"material":{"identifier":"Material","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"material","raw":"Material","text":"Material"},"facetable":false,"id":"7000000000000000009","value":{"sequence":3,"identifier":"WCL003_0303","normalized":"cotton","raw":"Cotton","id":"7000000000000000341"},"comparable":true,"key":"material","swatchable":false},"length":{"identifier":"Length","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"length","raw":"Length","text":"Length"},"facetable":false,"id":"7000000000000000025","value":{"sequence":2,"identifier":"WCL003_0303","normalized":"mini cut length","raw":"Mini cut length","id":"7000000000000000369"},"comparable":true,"key":"length","swatchable":false},"style":{"identifier":"Style","usage":"Descriptive","displayable":true,"merchandisable":false,"searchable":false,"sequence":0,"name":{"normalized":"style","raw":"Style","text":"Style"},"facetable":false,"id":"7000000000000000010","value":{"identifier":"WCL003_0303","sequence":1,"normalized":"pull on","raw":"Pull on","id":"7000000000000000356"},"comparable":true,"key":"style","swatchable":false}},"relationship":{"product":{"sequence":[100.0],"id":["11062"]}},"__meta":{"modified":"2020-08-04T03:08:33.073Z"}} }

Exemples de l'étape 12

Le code suivant est un exemple des données d'entrée pour le processeur FindAttributesFromDatabase.
{
  "CATENTRY_ID" : 10350,
  "USAGE" : "2",
  "LANGUAGE_ID" : "-1",
  "STOREENT_ID" : "10501",
  "ATTRTYPE_ID" : "STRING          ",
  "ATTR_ID" : "7000000000000000005",
  "DISPLAY_SEQUENCE" : "1",
  "ATTR_IDENTIFIER" : "material",
  "ATTR_SEQUENCE" : "0",
  "DISPLAYABLE" : "1",
  "SEARCHABLE" : "0",
  "STOREDISPLAY": "0",
  "COMPARABLE" : "1",
  "FACETABLE" : "0",
  "MERCHANDISABLE" : "0",
  "SWATCHABLE" : "0",
  "ATTR_NAME" : "Material",
  "GROUPNAME" : " ",
  "ATTRVAL_IDENTIFIER" : "Cotton blend",
  "STRINGVALUE" : "Cotton blend",
  "INTEGERVALUE" : " ",
  "FLOATVALUE" : " ",
  "ATTRVAL_SEQUENCE" : "23",
  "QTYUNIT_ID" : "C62             ",
  "IMAGE1" : " ",
  "IMAGE2" : " ",
  "ATTRVAL_ID" : "7000000000000000032",
  "QTY_DESCRIPTION" : "one"
}
Le processeur FindAttributesFromDatabase transforme les données d'entrée avec l'ID de magasin, l'ID de langue et l'ID de catalogue transmis depuis la classe NiFi FlowFile en tant qu'attributs dans les exemples de données de sortie comme suit :
{ "update": { "_id": "1--1-10001-10350", "_index": ".auth.1.product.202006160325", "retry_on_conflict": 5, "_source": false } }

{
	"doc": {
		"7000000000000000005": {
			"identifier": "material",
			"usage": "Descriptive",
			"displayable": true,
			"ribbon": false,
			"merchandisable": false,
			"searchable": false,
			"sequence": 1.0,
			"name": {
				"normalized": "material",
				"raw": "Material",
				"text": "Material"
			},
			"facetable": false,
			"id": "7000000000000000005",
			"value": {
				"sequence": 23.0,
				"identifier": "Cotton blend",
				"unit": {
					"identifier": "C62",
					"name": {
						"raw": "one"
					}
				},
				"normalized": "cotton blend",
				"raw": "Cotton blend",
				"id": "7000000000000000032"
			},
			"comparable": true,
			"key": "7000000000000000005",
			"swatchable": false
		}
	},
	"__meta": {
		"modified": "2020-08-04T02:55:52.644Z"
	}
}​