Personalización de la carga de índice

Puede personalizar la carga de índice para que se adapten a sus necesidades de negocio. Por ejemplo, puede personalizar la carga de índice para leer de varios orígenes o cambiar la manera en que se transforma la entrada de origen.

Procedimiento

  • Personalización de la carga de índice utilizando sentencias SQL:

    El archivo wc-indexload-profileName.xml contiene las definiciones de objeto de negocio y de elemento de carga.

    Utilice los archivos de ejemplo siguientes como referencia.
    • wc-indexload-price.xml
    • wc-indexload-price-sql.xml
    El fragmento de código siguiente muestra cómo definir el objeto de negocio:
    
    <_config:LoadItem name="ExternalPrice-1" businessObjectConfigFile="wc-indexload-price-sql.xml">
    <_config:property name="coreName" value="MC_10001_CatalogEntry_Price_generic" />
    </_config:LoadItem>
    
    El fragmento de código de ejemplo siguiente muestra cómo definir los elementos de carga utilizando sentencias 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 &gt; ?" />
    <_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 &gt;= %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>  
    
  • Personalización de la carga de índice utilizando rangos leídos en la base de datos en paralelo:

    Puede definir las configuraciones de elementos de carga en paralelo que se pueden utilizar para dividir los datos de forma uniforme entre el conjunto de datos. Se utilizan múltiples hebras mediante SolrIndexLoadQueryLoader para soportar la indexación paralela basada en rangos automática.

    Utilice los archivos de ejemplo siguientes como referencia:
    • wc-indexload-price-adv.xml
    • wc-indexload-external-price-adv1.xml
    • wc-indexload-external-price-adv2.xml
    El fragmento de código de ejemplo siguiente muestra cómo definir los rangos de SQL ParallelLowerRangeSQL y 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 &gt; ?" />
    <config:SQL>
       SELECT TI.CATENTRY_ID,  TI.PRICE  FROM TI_CNTRPRICE_0 TI
    WHERE TI.CATENTRY_ID &gt;= %ParallelLowerRange%
       AND TI.CATENTRY_ID <= %ParallelUpperRange%
    ORDER BY TI.CATENTRY_ID
     </_config:SQL>
    
    El siguiente fragmento de código de ejemplo muestra cómo definir los rangos codificados ParallelLowerRange y ParallelUpperRange:
    
    <_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 &gt; ?" />
    <config:SQL>
       SELECT TI.CATENTRY_ID,  TI.PRICE  FROM TI_CNTRPRICE_0 TI
    WHERE TI.CATENTRY_ID &gt;= %ParallelLowerRange%
       AND TI.CATENTRY_ID <= %ParallelUpperRange%
    ORDER BY TI.CATENTRY_ID
     </_config:SQL>
    
  • Personalización del Mediador de objetos de negocio:

    Puede personalizar el Mediador de objetos de negocio para cambiar la forma en que se transforma la entrada de origen.

    Cree una clase de mediador de objeto de negocio personalizado que amplíe 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 subclase debe implementar el método abstracto transform(). Este método transforma el objeto de negocio de lógica de entrada en un objeto de documento físico que se debe guardar en el índice de Solr. Una vez que el método transform() ha finalizado, la superclase pasa la lista de objetos físicos a la capa de persistencia para hacerlos persistir en el índice de Solr. La subclase es responsable de llenar todos los datos en los objetos físicos.

    Por ejemplo, para transformar la entrada siguiente en varias columnas en el índice de precios:
    
    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.25
    
    El siguiente fragmento de código es la implementación predeterminada para realizar la transformación:
    
    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);
          }
       }
    
    Como resultado se forman los valores siguientes:
    
    <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> 
    
  • Personalización de SolrIndexLoadQueryReader para transformar varias entradas de datos de una tabla de base de datos en una sola fila de índice:

    SolrIndexLoadQueryMultiplexReader puede utilizarse para transformar varias entradas de datos de una tabla de base de datos en una fila de índice única que contenga varios campos de índice dinámico.

    Defina la propiedad KeyFieldName utilizando un campo de clave primaria. La columna de base de datos que se correlaciona con este campo de índice de clave primaria se utiliza como el identificador de la entrada de índice.