Pipeline d'index Catégorie 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.

Spécifications de données de catégorie

Pour plus d'informations sur l'appel du service Ingest, voir Rechercher l'API de service Ingest. Pour une liste complète des zones et des paramètres d'index Elasticsearch, voir Types de zones d'index Elasticsearch.

Spécification des données :

Nom de la zone de données Type de données Valeur de données
/uniqueId long L'identificateur interne du groupe de catalogues Commerce.
/identifier chaîne L'identificateur du groupe de catalogues externe.
​/parentCategories/parentCategoryId long L'identificateur interne de la catégorie Commerce de la catégorie parent de ce groupe de catalogues.
​/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 ce groupe de catalogues.
​/descriptions/description chaîne Une courte description de ce groupe de catalogues.
​/descriptions/longDescription chaîne La description longue de ce groupe de catalogues.
​/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 ce groupe de catalogues.
​/descriptions/fullImage chaîne Le chemin de l'image en taille réelle de ce groupe de catalogues.
​/descriptions/published boolean Indique si ce groupe de catalogues doit être affiché pour la langue actuelle. Paramètre par défaut : false.
​/descriptions/sequence float

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

Le diagramme suivant illustre le pipeline d'indexation Catégorie implémenté dans Apache NiFi. Le flux se compose de deux étapes :
  1. Chargement des documents de catégorie
  2. Génération d'une hiérarchie de catalogue et de chemins de navigation pour chaque catégorie de vente

Etape 1 : Chargement d'un document de catégorie

Cette phase décrit comment les données de catégorie peuvent être transformées à l'aide du script Groovy CreateCategoryDocument et chargées dans l'index Catégorie. ​​​​​​​​​​​​​​Le tableau de mappage suivant définit comment les données de Spécifications de données de catégorie peuvent être mappées dans le schéma d'index de catégorie dans Elasticsearch.

Nom de zone d'index Type de zone d'index Comment la valeur peut être affectée
​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/​catgroup ​id_long Assigné directement à partir de la zone de données "uniqueId"
​id/member id_long
​identifier/specification id_​string Toujours défini sur "catégorie"
​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/category/raw ​​raw Assigné directement à partir de la zone de données "identifier"
​identifier/category/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
​keyword/text texte Assigné directement à partir de la zone de données "keyword"
displayable boolean Assigné directement à partir de la zone de données "published" de la langue actuelle
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
Les définitions des alias de type zone (en italique) sont décrites dans Indexer les alias de type de zone et les utilisations.

Etape 2 : 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 Catégorie. Il commence par exécuter la requête Elasticsearch suivante au niveau de l'index Catégorie actuel.
{
  "stored_fields": [
    "id.*",
    "category.*"
  ],
  "size": 10000,
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "category.parent"
        }
      },
      "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 BuildCatalogHierarchyForCategory pour transformation et utilise la logique suivante pour générer l'arborescence de navigation.
  • 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 de vente 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.*"
    		],
    		"size": 10000,
    		"query": {
    		  "bool": {
    			"must": {
    			  "match_all": {}
    			},
    			"filter": [
    			  {
    				"terms": {
    				  "category.parent": [ "10020", ... ]
    				}
    			  },
    			  {
    				"term": {
    				  "id.store": "1"
    				}
    			  },
    			  {
    				"term": {
    				  "id.catalog": "10502"
    				}
    			  },
    			  {
    				"term": {
    				  "id.language": "-1"
    				}
    			  }
    			]
    		    }
    	​        }
    	}​
    La requête ci-dessus sera ensuite renvoyée au flux de données dans NiFi pour réexécution.
  • Pour tous les nœuds renvoyés au niveau actuel dans la hiérarchie du catalogue, parcourez chaque catégorie pour générer le chemin de navigation complet qui y mène dans ce catalogue de vente actuel.
    Nom de zone d'index Type de zone d'index Description
    chemin texte Zone segmentée pour le chemin de navigation complet vers le nœud de catégorie actuel 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 Catégorie à partir de la base de données

La génération d'un index Catégorie à partir de la base de données Commerce se fait en trois étapes :
  1. Création d'un document Catégorie
  2. Mise à jour avec les informations de facette
  3. Génération d'une hiérarchie de catalogue pour la navigation

Etape 1 - Création d'un document de catégorie

Cette étape décrit comment les données Catégorie peuvent être transformées et chargées dans l'index Catégorie. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Catégorie depuis la base de données Commerce :
(SELECT C.CATGROUP_ID, C.MEMBER_ID, C.IDENTIFIER, 
            COALESCE(D.LANGUAGE_ID, L.LANGUAGE_ID) LANGUAGE_ID, 
            D.NAME, D.SHORTDESCRIPTION, D.THUMBNAIL, D.FULLIMAGE, 
            D.PUBLISHED, D.DISPLAY, D.KEYWORD,
            R.CATGROUP_ID_PARENT, R.CATALOG_ID, R.SEQUENCE, L.LOCALENAME
	   FROM CATGRPREL R, LANGUAGE L, CATGROUP C ${TI_DELTA_CG_JOIN_QUERY}
            LEFT OUTER JOIN CATGRPDESC D ON (D.CATGROUP_ID = C.CATGROUP_ID AND D.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.CATGROUP_ID_CHILD = C.CATGROUP_ID AND C.MARKFORDELETE = 0 AND L.LANGUAGE_ID = ${param.langId} ${extCatgroupAndSQL}
      UNION
	 SELECT C.CATGROUP_ID, C.MEMBER_ID, C.IDENTIFIER, 
            COALESCE(D.LANGUAGE_ID, L.LANGUAGE_ID) LANGUAGE_ID,
            D.NAME, D.SHORTDESCRIPTION, D.THUMBNAIL, D.FULLIMAGE, 
            D.PUBLISHED, D.DISPLAY, D.KEYWORD,
            NULL, R.CATALOG_ID, R.SEQUENCE, L.LOCALENAME
	   FROM CATTOGRP R, LANGUAGE L, CATGROUP C ${TI_DELTA_CG_JOIN_QUERY}
            LEFT OUTER JOIN CATGRPDESC D ON (D.CATGROUP_ID = C.CATGROUP_ID AND D.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.CATGROUP_ID = C.CATGROUP_ID AND C.MARKFORDELETE = 0 AND L.LANGUAGE_ID = ${param.langId} ${extCatgroupAndSQL}) ORDER BY CATGROUP_ID	
Ensuite, le jeu de résultats est transmis au processeur CreateCategoryDocumentFromDatabase 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 Catégorie :​
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 STORECGRP
id/langue id_​string L'identificateur de la langue ; mappé à CATGRPDESC.LANGUAGE_ID
id/​catalog id_​string L'ID interne du catalogue de vente ; mappé à CATGRPREL.CATALOG_ID
id/​catgroup id_​string L'ID interne de la catégorie actuelle ; mappé à CATGRPREL.CATGROUP_ID_CHILD
​id/member id_string​ Le numéro de référence interne qui identifie le propriétaire du groupe de catalogues ; mappé à CATGROUP.MEMBER_ID
​identifier/specification id_​string Défini sur "catégorie"
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 ce groupe de catalogues ; mappé depuis CATGRP​DESC​.LANGUAGE_ID
​​identifier/catalog id_​string L'identificateur externe du catalogue de vente ; mappé à CATGRPREL.CATALOG_ID
​identifier/category/raw ​​raw Même que ci-dessous
​identifier/category/normalized normalilsé Attributs de base de Catgroup : mappé à CATGROUP.IDENTIFIER
​​Données sensibles à la langue​​​
​name/raw ​​raw Le nom dépendant de la langue de ce groupe de catalogues ; mappé à CATGRPDESC.NAME
​​name/normalized normalized Identique à ci-dessus
​keyword/text texte Un mot clé utilisé pour la recherche ; mappé à CATGRPDESC.KEYWORD
url/​thumbnail raw Le chemin de l'image miniature de ce groupe de catalogues ; mappé à CATGRPDESC.THUMBNAIL
​url/​image raw Le chemin de l'image complet de ce groupe de catalogues ; mappé à CATGRPDESC.FULLIMAGE
Propriétés
displayable boolean Indique si ce groupe de catalogues doit être affiché pour la langue ; mappé à CATGRPDESC.PUBLISHED
Données de navigation
category/catalog id_​string Le catalogue de vente de ce document actuel utilisé pour la séquence ; mappé à CATGRPREL.CATALOG_ID
​category/parent id_string​ La catégorie de vente parent de ce document actuel utilisé pour la séquence ; mappé à CATGRPREL.CATGROUP_ID_PARENT
​category/sequence float La séquence de niveau catégorie de feuilles (peu profonde) définie dans CMC ; mappé à CATGRPREL.SEQUENCE
Pour un exemple de code, voir les exemples Stage 1.

Etape 2 - Mise à jour avec informations de facette

Cette étape décrit comment les données liées aux facettes peuvent être transformées et chargées dans l'index Catégorie. Il commence par exécuter l'instruction SQL suivante pour récupérer les données Catégorie depuis la base de données Commerce :
SELECT I.CATALOG_ID, I.CATGROUP_ID, I.CATGROUP_ID_PARENT,
	       LISTAGG(A.NAME, '###') WITHIN GROUP (ORDER BY A.ATTR_ID) NAME,
	       LISTAGG(A.ATTR_ID, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) ATTR_ID,
	       LISTAGG(A.IDENTIFIER, '###') WITHIN GROUP (ORDER BY A.ATTR_ID) IDENTIFIER,
	       LISTAGG(F.MAX_DISPLAY, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) MAX_DISPLAY,
	       LISTAGG(F.SELECTION, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) SELECTION,
	       LISTAGG(TO_CHAR(COALESCE(FCG.SEQUENCE, F.SEQUENCE)), ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) SEQUENCE,
	       LISTAGG(F.FACET_ID, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) FACET_ID,
	       LISTAGG(F.SORT_ORDER, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) SORT_ORDER,
	       LISTAGG(F.ZERO_DISPLAY, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) ZERO_DISPLAY,
	       LISTAGG(COALESCE(F.GROUP_ID, 0), ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) GROUP_ID,
	       LISTAGG(F.KEYWORD_SEARCH, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) KEYWORD_SEARCH,
	       LISTAGG(A.FACETABLE, ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) FACETABLE,
	       LISTAGG(A.SWATCHABLE,  ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) SWATCHABLE,
               LISTAGG(COALESCE(A.STOREDISPLAY, 0),  ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) STOREDISPLAY,
	       LISTAGG(COALESCE(FCG.STOREENT_ID, A.STOREENT_ID), ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) STOREENT_ID,
	       LISTAGG(COALESCE(FCG.DISPLAYABLE, 1), ', ') WITHIN GROUP (ORDER BY A.ATTR_ID) DISPLAYABLE
	  FROM (SELECT A.ATTR_ID, A.IDENTIFIER, A.FACETABLE, A.SWATCHABLE, A.STOREDISPLAY, A.STOREENT_ID, COALESCE(D.NAME, DF.NAME) NAME
	          FROM ATTR A
	               LEFT JOIN ATTRDESC D ON D.ATTR_ID = A.ATTR_ID AND D.LANGUAGE_ID = ${param.langId}
	               LEFT OUTER JOIN ATTRDESC DF ON DF.ATTR_ID = A.ATTR_ID AND DF.LANGUAGE_ID = ${default.language}) A,
	               FACET F
				   LEFT JOIN FACETCATGRP FCG ON F.FACET_ID = FCG.FACET_ID AND FCG.STOREENT_ID = ${param.storeId},
	               (SELECT DISTINCT P.CATALOG_ID, P.CATGROUP_ID, C.ATTR_ID, H.CATGROUP_ID_PARENT
	                  FROM CATGPENREL P, CATENTRYATTR C,
                           (SELECT G.CATGROUP_ID, R.CATALOG_ID, R.CATGROUP_ID_PARENT
                              FROM CATGRPREL R, CATGROUP G
                             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.CATGROUP_ID_CHILD = G.CATGROUP_ID AND G.MARKFORDELETE = 0
                            UNION
                           SELECT G.CATGROUP_ID, R.CATALOG_ID, NULL 
                             FROM CATTOGRP R, CATGROUP G
                            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.CATGROUP_ID = G.CATGROUP_ID AND G.MARKFORDELETE = 0) H
	                  WHERE P.CATALOG_ID = H.CATALOG_ID AND P.CATGROUP_ID = H.CATGROUP_ID
	                    AND P.CATENTRY_ID = C.CATENTRY_ID ${extCatgroupAndSQL1a}) I
	 ${TI_DELTA_CG_FACET_JOIN_QUERY}
	 WHERE I.ATTR_ID = A.ATTR_ID AND A.ATTR_ID = F.ATTR_ID
	   AND F.STOREENT_ID IN
	       (SELECT RELATEDSTORE_ID FROM STOREREL WHERE STATE = 1 AND STRELTYP_ID = -4 AND STORE_ID = ${param.storeId})
	 GROUP BY I.CATALOG_ID, I.CATGROUP_ID, I.CATGROUP_ID_PARENT

Ensuite, le jeu de résultats est transmis au processeur FindFacetsForCategoryFromDatabase 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 Catégorie :​

Nom de zone d'index Type de zone d'index Description
Données de navigation
​facets/<id>/id ​​id_string L'identificateur de facette interne de la facette correspondante ; mappé à FACET.FACET_ID
​facets/<id>/key id_​string L'identificateur de facettes normalisé qui est utilisé comme clé pour cette entrée de facette actuelle ; généré à partir de ATTR.IDENTIFIER
​facets/<id>/search boolean Décrit si la facette doit être incluse dans la recherche de mots clés ; mappé à FACET.KEYWORD_SEARCH
​facets/<id>/displayable boolean Décrit si la facette doit être affichée dans la vitrine ; mappé à FACETCATGRP.DISPLAYABLE
​​facets/<id>/sequence float La séquence de la facette affichée dans la vitrine ; mappé à FACET.SEQUENCE
​facets/<id>/​group id_string​ L'identificateur de groupe interne de la facette à utiliser dans la vitrine ; mappé à FACET.GROUP_ID
​​facets/<id>/attribute/id id_string​ L'ID d'attribut interne correspondant de la facette actuelle ; mappé à FACET.ATTR_ID
​facets/<id>/attribute/name id_string​ Le nom d'attribut spécifique au langage correspondant de la facette actuelle
​facets/<id>/attribute/identifier id_string​ L'identificateur d'attribut correspondant de la facette actuelle ; mappé à ATTR.IDENTIFIER
​facets/<id>/attribute/displayable boolean Identifie si cette facette doit être affichée dans la vitrine ; mappé à ATTR.DISPLAYABLE
​facets/<id>/attribute/swatchable boolean Identifie si cette facette peut être utilisée avec des images pour la création de facettes ; mappé à ATTR.SWATCHABLE
facets/<id>attribute/ribbon boolean ​Identifie si cet attribut peut être utilisé comme ruban pour l'affichage ; mappée à ATTR.STOREDISPLAY​
​facets/<id>/attribute/usage raw Décrit l'utilisation de cet attribut ; mappé à ATTR.ATTRUSAGE
​​facets/<id>/display/limit entier Les valeurs maximales à afficher dans la vitrine pour la facette ; mappé à FACET.MAX_DISPLAY
​facets/<id>/display/zero boolean Décrit si l'attribut apte aux facettes doit afficher des valeurs de comptage nulles ; mappé à FACET.ZERO_DISPLAY
​facets/<id>/display/multiple boolean Décrit si l'attribut apte aux facettes permet plusieurs sélections ; mappé à FACET.SELECTION
​facets/<id>/display/order entier L'ordre d'affichage à utiliser lors de l'affichage des valeurs de la facette ; mappé à FACET.SORT_ORDER

Pour un exemple de code, voir les exemples Etape 2.

Etape 3 - 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 Catégorie. Il commence par exécuter la requête Elasticsearch suivante au niveau de l'index Catégorie actuel :​

{
  "stored_fields": [
    "id*",
    "category.*",
    "name.*"
  ],
  "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}"
          }
        }
      ]
    }
  }
}​
Ensuite, le jeu de résultats est transmis au processeur BuildCatalogHierarchyForCategory 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 de niveau supérieur du catalogue de vente 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"
                    }
                }
            ]
        }
    }
}​​

La requête ci-dessus sera ensuite renvoyée au flux de données dans NiFi pour réexécution.

Note: Pour tous les nœuds renvoyés au niveau actuel dans la hiérarchie du catalogue, parcourez chaque catégorie pour générer le chemin de navigation complet qui y mène dans ce catalogue de vente actuel :
Nom de zone d'index Type de zone d'index Description
Données de navigation
​category/child id_​string La catégorie de vente enfant de ce document actuel utilisé pour la séquence ; mappé à CATGRPREL.CATGROUP_ID_CHILD
category/sequence​​ float La séquence de niveau catégorie de feuilles (peu profonde) définie dans CMC ; mappé à CATGRPREL.SEQUENCE
chemin ​​raw Zone segmentée pour le chemin de navigation complet vers le nœud de catégorie actuel dans le catalogue de ventes. 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, ce champ stocke la forme originale du chemin d'accès
path/tree hiérarchie Il s'agit de la version segmentée de la zone de chemin d'accès ci-dessus, par exemple 1, 3, 10001
path/list ​​raw Il s'agit de la version canonique pour la liste des noms de zones de chemin d'accès, par exemple Aurora, Women, Dress
Pour un exemple de code, voir les exemples Etape 3.

Exemples de mappage de base de données :

Stage 1

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

{
  "CATGROUP_ID": 5,
  "MEMBER_ID": 7000000000000001000,
  "IDENTIFIER": "Girls",
  "LANGUAGE_ID": -1,
  "NAME": "Girls",
  "SHORTDESCRIPTION": "Girls",
  "LONGDESCRIPTION": null,
  "THUMBNAIL": "images/catalog/apparel/girls/category/catr_app_girls.png",
  "FULLIMAGE": "images/catalog/apparel/girls/category/catr_app_girls.png",
  "PUBLISHED": 1,
  "DISPLAY": null,
  "KEYWORD": "casual, sporty, skirt, sweater, kid",
  "CATGROUP_ID_PARENT": 1,
  "CATALOG_ID": 10001,
  "SEQUENCE": 1,
  "LOCALENAME": "en_US           "
}
Le processeur CreateCategoryDocumentFromDatabase transforme les données d'entrée en données de sortie suivantes :

{ "update": { "_id": "1--1-10001-5", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "identifier": {
      "specification": "category",
      "language": "en_US",
      "category": {
        "normalized": "Girls",
        "raw": "Girls"
      }
    },
    "name": {
      "normalized": "Girls",
      "raw": "Girls"
    },
    "displayable": true,
    "description": {
      "raw": "Girls"
    },
    "id": {
      "catalog": "10001",
      "member": "7000000000000001000",
      "catgroup": "5",
      "language": "-1",
      "store": "1"
    },
    "keyword": {
      "text": "casual, sporty, skirt, sweater, kid"
    },
    "category": {
      "parent": "1",
      "sequence": 1,
      "catalog": "10001"
    },
    "url": {
      "image": "images/catalog/apparel/girls/category/catr_app_girls.png",
      "thumbnail": "images/catalog/apparel/girls/category/catr_app_girls.png"
    },
    "__meta": {
      "created": "2020-07-30T13:10:34.018Z",
      "modified": "2020-07-30T13:10:34.046Z",
      "version": {
        "min": 0,
        "max": 0
      }
    }
  },
  "doc_as_upsert": true
}

Etape 2

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

{
  "CATALOG_ID": 10001,
  "CATGROUP_ID": 10001,
  "NAME": "Available Sizes",
  "ATTR_ID": "7000000000000000001",
  "IDENTIFIER": "swatchSize",
  "MAX_DISPLAY": "-1",
  "SELECTION": "0",
  "SEQUENCE": "0",
  "FACET_ID": "3074457345618269104",
  "SORT_ORDER": "0",
  "ZERO_DISPLAY": "0",
  "GROUP_ID": "0",
  "KEYWORD_SEARCH": "1",
  "FACETABLE": "1",
  "SWATCHABLE": "0",
  "STOREENT_ID": "10501",
  "DISPLAYABLE": "1"
}
Le processeur FindFacetsForCategoryFromDatabase transforme les données d'entrée ci-dessus avecstore id, languages 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-10001", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{
  "doc": {
    "__meta": {
      "modified": "2020-07-30T13:42:12.819Z"
    },
    "facets": {
      "swatchsize": {
        "sequence": 0,
        "search": true,
        "display": {
          "zero": false,
          "limit": -1,
          "multiple": false,
          "order": 0
        },
        "displayable": true,
        "id": "3074457345618269104",
        "attribute": {
          "identifier": "swatchSize",
          "name": "Available Sizes",
          "id": "7000000000000000001",
          "swatchable": false
        },
        "key": "swatchsize",
        "group": "0"
      }
    }
  }
}

Etape 3

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

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 6,
      "relation": "eq"
    },
    "max_score": 0,
    "hits": [
      {
        "_index": ".auth.1.category.202006182302",
        "_type": "_doc",
        "_id": "1--1-10502-10",
        "_score": 0,
        "fields": {
          "name.normalized": [
            "newsletters & magazines"
          ],
          "id.member": [
            "7000000000000001001"
          ],
          "identifier.category.normalized": [
            "newslettersandmagazines"
          ],
          "name.raw": [
            "Newsletters & Magazines"
          ],
          "identifier.category.raw": [
            "NewslettersAndMagazines"
          ],
          "category.catalog": [
            "10502"
          ],
          "identifier.language": [
            "en_US"
          ],
          "id.catgroup": [
            "10"
          ],
          "id.catalog": [
            "10502"
          ],
          "identifier.specification": [
            "category"
          ],
          "id.language": [
            "-1"
          ],
          "id.store": [
            "1"
          ],
          "category.sequence": [
            6
          ]
        }
      },
      {
        "_index": ".auth.1.category.202006182302",
        "_type": "_doc",
        "_id": "1--1-10502-7",
        "_score": 0,
        "fields": {
          "name.normalized": [
            "grocery"
          ],
          "id.member": [
            "7000000000000001001"
          ],
          "identifier.category.normalized": [
            "grocery"
          ],
          "name.raw": [
            "Grocery"
          ],
          "identifier.category.raw": [
            "Grocery"
          ],
          "category.catalog": [
            "10502"
          ],
          "identifier.language": [
            "en_US"
          ],
          "id.catgroup": [
            "7"
          ],
          "id.catalog": [
            "10502"
          ],
          "identifier.specification": [
            "category"
          ],
          "id.language": [
            "-1"
          ],
          "id.store": [
            "1"
          ],
          "category.sequence": [
            3
          ]
        }
      },
      {
        "_index": ".auth.1.category.202006182302",
        "_type": "_doc",
        "_id": "1--1-10502-8",
        "_score": 0,
        "fields": {
          "name.normalized": [
            "health"
          ],
          "id.member": [
            "7000000000000001001"
          ],
          "identifier.category.normalized": [
            "health"
          ],
          "name.raw": [
            "Health"
          ],
          "identifier.category.raw": [
            "Health"
          ],
          "category.catalog": [
            "10502"
          ],
          "identifier.language": [
            "en_US"
          ],
          "id.catgroup": [
            "8"
          ],
          "id.catalog": [
            "10502"
          ],
          "identifier.specification": [
            "category"
          ],
          "id.language": [
            "-1"
          ],
          "id.store": [
            "1"
          ],
          "category.sequence": [
            4
          ]
        }
      },
      {
        "_index": ".auth.1.category.202006182302",
        "_type": "_doc",
        "_id": "1--1-10502-6",
        "_score": 0,
        "fields": {
          "name.normalized": [
            "electronics"
          ],
          "id.member": [
            "7000000000000001001"
          ],
          "identifier.category.normalized": [
            "electronics"
          ],
          "name.raw": [
            "Electronics"
          ],
          "identifier.category.raw": [
            "Electronics"
          ],
          "category.catalog": [
            "10502"
          ],
          "identifier.language": [
            "en_US"
          ],
          "id.catgroup": [
            "6"
          ],
          "id.catalog": [
            "10502"
          ],
          "identifier.specification": [
            "category"
          ],
          "id.language": [
            "-1"
          ],
          "id.store": [
            "1"
          ],
          "category.sequence": [
            2
          ]
        }
      },
      {
        "_index": ".auth.1.category.202006182302",
        "_type": "_doc",
        "_id": "1--1-10502-9",
        "_score": 0,
        "fields": {
          "name.normalized": [
            "home & furnishing"
          ],
          "id.member": [
            "7000000000000001001"
          ],
          "identifier.category.normalized": [
            "home furnishings"
          ],
          "name.raw": [
            "Home & Furnishing"
          ],
          "identifier.category.raw": [
            "Home Furnishings"
          ],
          "category.catalog": [
            "10502"
          ],
          "identifier.language": [
            "en_US"
          ],
          "id.catgroup": [
            "9"
          ],
          "id.catalog": [
            "10502"
          ],
          "identifier.specification": [
            "category"
          ],
          "id.language": [
            "-1"
          ],
          "id.store": [
            "1"
          ],
          "category.sequence": [
            5
          ]
        }
      },
      {
        "_index": ".auth.1.category.202006182302",
        "_type": "_doc",
        "_id": "1--1-10502-1",
        "_score": 0,
        "fields": {
          "name.normalized": [
            "apparel"
          ],
          "id.member": [
            "7000000000000001001"
          ],
          "identifier.category.normalized": [
            "apparel"
          ],
          "name.raw": [
            "Apparel"
          ],
          "identifier.category.raw": [
            "Apparel"
          ],
          "category.catalog": [
            "10502"
          ],
          "identifier.language": [
            "en_US"
          ],
          "id.catgroup": [
            "1"
          ],
          "id.catalog": [
            "10502"
          ],
          "identifier.specification": [
            "category"
          ],
          "id.language": [
            "-1"
          ],
          "id.store": [
            "1"
          ],
          "category.sequence": [
            1
          ]
        }
      }
    ]
  }
}

Le processeur BuildCatalogHierarchyForCategory transforme ces données d'entrée en un ensemble de données de sortie, l'une pour la relation suivante et l'autre pour la relation de mise à jour, comme indiqué dans le diagramme de flux NiFi.

Les exemples de données de sortie suivants sont présentés pour la relation suivante :

{
  "stored_fields": [
    "id*",
    "category.*",
    "name.*"
  ],
  "size": 10000,
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": [
        {
          "terms": {
            "category.parent": [
              "11",
              "1",
              "6",
              "7",
              "8",
              "9",
              "10"
            ]
          }
        },
        {
          "term": {
            "id.store": "1"
          }
        },
        {
          "term": {
            "id.catalog": "10001"
          }
        },
        {
          "term": {
            "id.language": "-1"
          }
        }
      ]
    }
  }
}
Les exemples de données de sortie suivants sont présentés pour la relation de mise à jour :

{ "update": { "_id": "1--1-10001-7", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/7","category":{"path":{"name":["Grocery"],"id":["7"]}},"__meta":{"modified":"2020-07-31T12:57:33.942Z"}} }
{ "update": { "_id": "1--1-10001-9", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/9","category":{"path":{"name":["Home & Furnishing"],"id":["9"]}},"__meta":{"modified":"2020-07-31T12:57:34.409Z"}} }
{ "update": { "_id": "1--1-10001-6", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/6","category":{"path":{"name":["Electronics"],"id":["6"]}},"__meta":{"modified":"2020-07-31T12:57:34.410Z"}} }
{ "update": { "_id": "1--1-10001-1", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/1","category":{"path":{"name":["Apparel"],"id":["1"]}},"__meta":{"modified":"2020-07-31T12:57:34.410Z"}} }
{ "update": { "_id": "1--1-10001-11", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/11","category":{"path":{"name":["Hardware"],"id":["11"]}},"__meta":{"modified":"2020-07-31T12:57:34.411Z"}} }
{ "update": { "_id": "1--1-10001-8", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/8","category":{"path":{"name":["Health"],"id":["8"]}},"__meta":{"modified":"2020-07-31T12:57:34.411Z"}} }
{ "update": { "_id": "1--1-10001-10", "_index": ".auth.1.category.202006160325", "retry_on_conflict": 5, "_source": false } }
{ "doc": {"path":"/10","category":{"path":{"name":["Newsletters & Magazines"],"id":["10"]}},"__meta":{"modified":"2020-07-31T12:57:34.412Z"}} }