Personnalisation de Chargement d'index
Vous pouvez personnaliser Chargement d'index dans la vitrine en fonction de vos besoins métier. Par exemple, vous pouvez personnaliser Chargement d'index afin qu'il lise à partir de plusieurs sources ou modifier la façon dont l'entrée source est transformée.
Procédure
-
Personnalisation de Chargement d'index à l'aide d'instructions SQL :
Le fichier wc-indexload-profileName.xml contient les définitions d'objets métier et d'articles de chargement.
Utilisez les exemples de fichiers suivants comme référence.- wc-indexload-price.xml
- wc-indexload-price-sql.xml
L'exemple de fragment suivant montre comment définir l'objet métier :<_config:LoadItem name="ExternalPrice-1" businessObjectConfigFile="wc-indexload-price-sql.xml"> <_config:property name="coreName" value="MC_10001_CatalogEntry_Price_generic" /> </_config:LoadItem>L'exemple de fragment suivant montre comment définir les articles de chargement à l'aide d'instructions SQL :<_config:DataLoader className="com.ibm.commerce.foundation.server.services.indexload.loader.solr.SolrIndexLoadQueryLoader"> <_config:property name="ParallelThreads" value="2" /> <_config:property name="ParallelLowerRangeSQL" value="SELECT MIN(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE" /> <_config:property name="ParallelUpperRangeSQL" value="SELECT MAX(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE" /> <_config:property name="ParallelNextRangeSQL" value="SELECT MIN(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE WHERE CE.CATENTRY_ID > ?" /> <_config:property name="ParallelLowerRange" value="" /> <_config:property name="ParallelUpperRange" value="" /> <_config:property name="ParallelPrefetchSize" value="100" /> <_config:DataReader className="com.ibm.commerce.foundation.server.services.indexload.reader.solr.SolrIndexLoadQueryMultiplexReader"> <_config:DynamicFields> </_config:DynamicFields> <_config:Query> <_config:SQL> SELECT TI.CATENTRY_ID, TI.PRICE FROM TI_CNTRPRICE_0 TI WHERE TI.CATENTRY_ID >= %ParallelLowerRange% AND TI.CATENTRY_ID <= %ParallelUpperRange% ORDER BY TI.CATENTRY_ID /_config:SQL> <_config:ColumnMapping name="CATENTRY_ID" value="catentry_id" /> <_config:ColumnMapping name="PRICE" value="price" /> </_config:Query> </_config:DataReader> <_config:BusinessObjectBuilder className="com.ibm.commerce.foundation.internal.server.services.indexload.builder.SolrIndexLoadMapObjectBuilder" > <_config:BusinessObjectMediator className="com.ibm.commerce.foundation.internal.server.services.indexload.mediator.SolrIndexLoadBusinessObjectMediator"> <_config:extension className="com.ibm.commerce.foundation.server.services.indexload.mediator.solr.SolrIndexLoadExternalPriceMediator" /> </_config:BusinessObjectMediator> </_config:BusinessObjectBuilder> </_config:DataLoader> -
Personnalisation de Chargement d'index à l'aide de plages pour lire la base de données en parallèle :
Vous pouvez configurer des configurations d'articles de chargement parallèles qui peuvent être utilisées pour répartir les données uniformément dans l'ensemble de données. Plusieurs unités d'exécution sont utilisées à l'aide de SolrIndexLoadQueryLoader pour prendre en charge l'indexation parallèle automatique basée sur la plage.
Utilisez les exemples de fichiers suivants comme référence :- wc-indexload-price-adv.xml
- wc-indexload-external-price-adv1.xml
- wc-indexload-external-price-adv2.xml
L'exemple de fragment suivant montre comment définir les plages SQL ParallelLowerRangeSQL et ParallelUpperRangeSQL :<_config:property name="ParallelThreads" value="2" /> <_config:property name="ParallelLowerRangeSQL" value="SELECT MIN(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE" /> <_config:property name="ParallelUpperRangeSQL" value="SELECT MAX(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE" /> <_config:property name="ParallelNextRangeSQL" value="SELECT MIN(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE WHERE CE.CATENTRY_ID > ?" /> <config:SQL> SELECT TI.CATENTRY_ID, TI.PRICE FROM TI_CNTRPRICE_0 TI WHERE TI.CATENTRY_ID >= %ParallelLowerRange% AND TI.CATENTRY_ID <= %ParallelUpperRange% ORDER BY TI.CATENTRY_ID </_config:SQL>L'exemple de fragment suivant montre comment définir les plages ParallelLowerRange et ParallelUpperRange codées en dur :<_config:property name="ParallelThreads" value="2" /> <_config:property name="ParallelLowerRange" value="1000" /> <_config:property name="ParallelUpperRange" value="2000" /> <_config:property name="ParallelNextRangeSQL" value="SELECT MIN(CE.CATENTRY_ID) FROM TI_CNTRPRICE_0 CE WHERE CE.CATENTRY_ID > ?" /> <config:SQL> SELECT TI.CATENTRY_ID, TI.PRICE FROM TI_CNTRPRICE_0 TI WHERE TI.CATENTRY_ID >= %ParallelLowerRange% AND TI.CATENTRY_ID <= %ParallelUpperRange% ORDER BY TI.CATENTRY_ID </_config:SQL> -
Personnalisation du médiateur d'objet métier :
Vous pouvez personnaliser le médiateur d'objet métier pour modifier la façon dont l'entrée source est transformée.
Créez une classe de médiateur d'objet métier personnalisée qui étend SolrIndexLoadBusinessObjectMediator :protected void transform(Object dataObjects, boolean deleteFlag) throws DataLoadException { final String METHODNAME = "transform(Object, boolean)"; if (LoggingHelper.isTraceEnabled(LOGGER)) { LOGGER.entering(CLASSNAME, METHODNAME, new Object[] { dataObjects, deleteFlag }); } if (LoggingHelper.isEntryExitTraceEnabled(LOGGER)) { LOGGER.exiting(CLASSNAME, METHODNAME); } }La sous-classe doit implémenter la méthode abstraite transform(). Cette méthode transforme l'objet métier logique d'entrée en objet de document physique à enregistrer dans l'index Solr. Une fois la méthode transform() terminée, la super classe transmet la liste des objets physiques vers la couche de persistance pour les conserver dans l'index Solr. La sous-classe est responsable du remplissage de toutes les données dans les objets physiques.
Par exemple, pour transformer l'entrée suivante en plusieurs colonnes dans l'index de prix :catentry_id price 10001 price_USD_10001:100.00||price_EUR_10001:78.29||price_JPY_10001:11274|| price_KRW_10001:95048||price_BRL_10001:232.15||price_CNY_10001:802.25Le fragment suivant est l'implémentation par défaut pour effectuer la transformation :public void transform(Map<String, Object> document) throws SolrIndexLoadException { final String METHODNAME = "transform(Map<String, Object>)"; if (LoggingHelper.isEntryExitTraceEnabled(LOGGER)) { LOGGER.entering(CLASSNAME, METHODNAME, new Object[] { document }); } if (document != null && !document.isEmpty()) { Object fieldValue = document.get("price"); StringTokenizer st = new StringTokenizer(fieldValue.toString(), "||"); while(st.hasMoreTokens()){ String priceElement = (String)st.nextElement(); int i = priceElement.lastIndexOf(":"); if (i < 0) { LOGGER.logp(Level.WARNING, CLASSNAME, METHODNAME, "ignoring invalid data format: " + priceElement + "(" + String.valueOf(document.get(0)) + ")"); continue; } String priceFieldName = priceElement.substring(0, i); //String currency = value.substring(6,i); String price = priceElement.substring(i + 1); Float newprice = Float.valueOf(price); document.put(priceFieldName, newprice); } document.remove("price"); } else { if (LoggingHelper.isTraceEnabled(LOGGER)) { LOGGER.logp(Level.WARNING, CLASSNAME, METHODNAME, "nothing to process"); } } if (LoggingHelper.isEntryExitTraceEnabled(LOGGER)) { LOGGER.exiting(CLASSNAME, METHODNAME); } }Il en résulte les valeurs suivantes :<float name=" price_USD_10001">100.00</float> <float name=" price_EUR_10001">78.29</float> <float name=" price_JPY_10001">11274</float> <float name=" price_KRW_10001">95048</float> <float name=" price_BRL_10001">232.15</float> <float name=" price_CNY_10001">802.25</float> -
Personnalisation de SolrIndexLoadQueryReader pour transformer plusieurs entrées de données d'une table de base de données en une seule ligne d'index :
SolrIndexLoadQueryMultiplexReader peut être utilisé pour transformer plusieurs entrées de données d'une table de base de données en une seule ligne d'index qui contient plusieurs zones d'index dynamiques.
Définissez la propriété KeyFieldName à l'aide d'une zone clé primaire. La colonne de base de données mappée à cette zone d'index de clé primaire est utilisée comme l'identificateur de l'entrée d'index.