Usar la característica de actualización atómica de Solr con la búsqueda

La actualización atómica, también conocida como actualización parcial, le permite realizar actualizaciones de índice en los campos almacenados especificados en un documento existente. Este enfoque es especialmente útil cuando un núcleo tiene muchos campos y solo se ha cambiado un pequeño número de ellos entre las creaciones de índice.

Solr da soporte a varios modificadores de actualización atómicas:
set
Establezca o sustituya un valor determinado, o elimine el valor si se especifica nulo como el nuevo valor.
añadir
Añade un valor adicional a una lista.
eliminar
Elimina un valor (o una lista de valores) de una lista.
removeregex
Elimina de una lista que coincide con la expresión regular Java especificada.
inc
Incrementa un valor numérico en una cantidad específica (utilice un valor negativo para disminuir),
Todos los campos de origen originales deben almacenarse para que los modificadores de campo funcionen correctamente. Este es el valor predeterminado en Solr. IndexLoad solo da soporte al modificador set, por lo que, de forma predeterminada, IndexLoad recuperará los datos de un archivo CSV o una base y utilizará dicho valor para sustituir el valor del campo Solr almacenado especificado.

Ejemplo

Supongamos que hay tres registros de inventario para el mismo producto pero de tiendas diferentes, tal como se indica a continuación:
catentry_id        "10044"
inv_strlocqty_1        100
inv_strlocqty_2        200
inv_strlocqty_3        300
indexedTime        "2018-11-28T14:51:58.042Z"
Se produce una actualización de inventario, actualizando un inventario disponible en la tienda de 1 a 400 y el inventario disponible en la tienda de 2 a 500.
catentry_id store_id availquantity
10044 1 400
10044 2 500
Para capturar este cambio, ejecute IndexLoad, cargue datos utilizando el siguiente archivo CSV de origen. Solo necesita proporcionar la cantidad actualizada final para las tiendas modificadas en este archivo CSV.
catentry_id,inv_strlocqty_1,inv_strlocqty_2
10044,400, 500
Después de cargar el índice, el documento en Solr será similar al siguiente:

catentry_id        "10044"
inv_strlocqty_1        400
inv_strlocqty_2        500
inv_strlocqty_3        300
indexedTime        "2018-11-28T15:51:38.033Z"

Procedimiento para utilizar la actualización atómica con un archivo CSV

  1. Cree el archivo de configuración de entorno workspace_dir\workspace\search-config-ext\src\index\indexloadwc-indexload-profileName-csv.xml, donde ProfileName es el parámetro URL que se utiliza cuando se llama IndexLoad en un navegador web. En los escenarios siguientes, price-delta se utiliza como profileName para el escenario csv y inventory-delta como profileName para el escenario SQL.
    El archivo wc-indexload-profileName-csv.xml contiene información de control de entorno y propiedades globales que son necesarias para la carga de índice. Por ejemplo, incluye la correlación de datos especificada entre el campo CSV y el campo Solr correspondiente. (Tiene la opción de dejar una columna vacía de datos si su nombre en este archivo coincide con un nombre de campo de Solr.) Este archivo también especifica el DataReader y el mediador. Para cargar desde un archivo CSV, especifique com.ibm.commerce.search.indexload.reader.SearchIndexLoadCSVReader como lector y com.ibm.commerce.search.indexload.mediator.SearchIndexLoadCSVMediator como BusinessObjectMediator. El archivo wc-indexload-profileName-csv.xml no suelen requerir personalización. Puede utilizar el archivo de ejemplo siguiente tal cual.
    <_config:DataLoader className="com.ibm.commerce.search.indexload.loader.SearchIndexLoadCSVLoader" >
             
                     <_config:property name="FirstLineIsHeader" value="true" />
                             <_config:property name="Charset" value="UTF-8" />
                    <_config:property name="TokenDelimiter" value="," />
        <_config:DataReader className="com.ibm.commerce.search.indexload.reader.SearchIndexLoadCSVReader" />
            <_config:BusinessObjectBuilder>
                        <_config:DataMapping>
          </_config:DataMapping>
          <_config:BusinessObjectMediator className="com.ibm.commerce.foundation.internal.server.services.indexload.mediator.SolrIndexLoadBusinessObjectMediator"/>
                                     <_config:BusinessObjectMediator className="com.ibm.commerce.search.indexload.mediator.SearchIndexLoadCSVMediator" />
                       </_config:BusinessObjectBuilder>
      </_config:DataLoader>
  2. Cree un archivo wc-indexload-profileName.xml de configuración de perfil.

    El archivo wc-indexload-profileName.xml contiene atributos de rendimiento configurables y una o varias definiciones de elementos de carga. También contiene la ubicación del archivo CSV y el nombre del núcleo de destino. Los nombres de perfil que defina en los archivos de configuración se sustituyen a continuación como un parámetro de URL cuando se llamaIndexLoad en un navegador web. Las configuraciones de elemento de carga se listan bajo la sección de orden de carga de este archivo. Cada definición de LoadItem especifica una configuración de elemento de carga determinada como coreName o location. Varios elementos de carga se ejecutan en paralelo. Dentro de cada sección de configuración de elemento de carga, debe especificarse el archivo de configuración de entorno wc-indexload-profileName-csv.xml. El archivo de configuración de perfil también contiene la configuración DataWriter; conserve el original com.ibm.commerce.search.indexload.writer.SearchIndexLoadBatchService como transcriptor. El archivo CSV solo necesita contener el valor de campo modificado. IndexLoad utilizará la API de actualización atómica de Solr para actualizar el campo almacenado especificado.

    Ejemplo: wc-indexload-price-delta.xml
    <_config:LoadItem name="ExternalPrice-1" fileName="wc-indexload-externalprice-csv.xml">
            <_config:property name="coreName" value="MC_10001_CatalogEntry_Price1_generic" />
            <_config:property name="groupName" value="1" />
            <_config:DataSourceLocation location="resources/search/index/indexload/contract-price-example1.csv" />
    </_config:LoadItem>
  3. Ejecute IndexLoad en modalidad POST con profileName definido en el paso 2. Por ejemplo, si el archivo de configuración profileName se denominó como wc-indexload-price-delta.xml, ejecute indexload con la URL:
    https://searchMaster:3738/search/admin/resources/indexload/profile/price-delta/start?catalogId=#MASTER_CATALOG_ID
  4. Después de que IndexLoad se haya ejecutado satisfactoriamente, ejecute WCB para crear el paquete y desplegar el paquete en el contenedor Docker de búsqueda. Para obtener más información, consulte Empaquetado del código personalizado para el despliegue.

Procedimiento para utilizar la actualización atómica a través de SQL

  1. Cree el archivo de configuración de entorno workspace_dir\workspace\search-config-ext\src\index\indexloadwc-indexload-profileName-sql.xml.

    Esta versión de SQL del archivo de configuración de entorno especifica la configuración de indexación paralela. Esta configuración se utilizará para dividir de forma uniforme el conjunto de datos en varias hebras cuando se ejecute con SolrIndexLoadQueryLoader y el código SQL de configuración, que se utiliza para capturar el dato del origen de datos especificado.

    Este archivo de configuración también especifica el lector de datos. Hay dos entradas de DataReader:
    com.ibm.commerce.search.indexload.reader.SearchIndexLoadQueryReader
    Puede utilizar este mandato para leer registros exclusivos de la base de datos y, posteriormente, guardarlos en el índice.
    com.ibm.commerce.search.indexload.reader.SearchIndexLoadQueryMultiplexReader
    Este mandato se utiliza para transformar varias entradas de datos de la tabla de base en una sola fila de índice con varios campos de índice dinámico.
    Lo siguiente es una entrada de DataReader de ejemplo, que se utiliza para obtener el inventario actualizado de una hora específica. Puesto que hay varios registros para cualquier catentryId exclusivo, el ejemplo utiliza com.ibm.commerce.search.indexload.reader.SearchIndexLoadQueryMultiplexReader para acumular varias filas.
    <_config:DataReader className="com.ibm.commerce.search.indexload.reader.SearchIndexLoadQueryMultiplexReader">
                <_config:DynamicFields>
                  <_config:DynamicField dynamicFieldName="inv_strlocqty_%storeId%" dynamicFieldValue="%quantity%" indexingMode="replace" />
                </_config:DynamicFields>
                <_config:property name="KeyFieldName" value="catentry_id" />
                <_config:property name="ExcludeFieldNames" value="storeId,quantity" />
                <_config:property name="minDelta" value="5"/>  
             <_config:Query>
                        <_config:SQL>
                                SELECT invavl.catentry_id, invavl.STORE_ID,INVAVL.AVAILQUANTITY
                                      FROM INVAVL, CATGPENREL
                                WHERE CATGPENREL.CATALOG_ID = 10001
                                                      AND INVAVL.CATENTRY_ID = CATGPENREL.CATENTRY_ID
                                              AND INVAVL.QUANTITYMEASURE = 'C62'
                                              AND INVAVL.LASTUPDATE BETWEEN '2018-11-25 16:45:24.000' AND current timestamp ORDER BY INVAVL.CATENTRY_ID WITH UR
                                </_config:SQL>
                <_config:ColumnMapping columnName="CATENTRY_ID" indexFieldName="catentry_id" />
                <_config:ColumnMapping columnName="STORE_ID" indexFieldName="storeId" />
                <_config:ColumnMapping columnName="AVAILQUANTITY" indexFieldName="quantity" />
               </_config:Query>
     </_config:DataReader>
  2. Cree un archivo workspace_dir\workspace\search-config-ext\src\index\indexloadwc-indexload-profileName.xml de configuración de perfil.
    Al igual que con el método de archivo CSV, especifique el archivo de configuración SQL en la sección load item:
    <_config:LoadItem name="Inventory-Delta" fileName="wc-indexload-dom-delta-inventory-sql.xml">
            <_config:property name="coreName" value="MC_10001_CatalogEntry_Inventory_generic" />
            <_config:property name="groupName" value="I" />
    </_config:LoadItem>
  3. Ejecute IndexLoad con profileName. Por ejemplo, si en el paso 2, el nombre de configuración del perfil es wc-indexload-inventory-delta.xml, ejecute:
    https://searchMaster:3738/search/admin/resources/indexload/profile/inventory-delta/start?catalogId=#MASTER_CATALOG_ID
  4. Después de que IndexLoad se haya ejecutado satisfactoriamente, ejecute WCB para crear el paquete y desplegar el paquete en el contenedor Docker de búsqueda. Para obtener más información, consulte Empaquetado del código personalizado para el despliegue.