Utilización del servicio GetSearchTermAssociation para pasar por alto la expansión de sinónimos de Solr en la búsqueda de HCL Commerce

Puede utilizar el servicio GetSearchTermAssociation en la búsqueda de HCL Commerce para evaluar sinónimos y sustituciones, en lugar de utilizar la implementación de la expansión de sinónimos y sustituciones de Solr predeterminada. Por ejemplo, estos son los pasos para cambiar la búsqueda básica de la tienda en la tienda de inicio de Madisons para utilizar el servicio GetSearchTermAssociation en la búsqueda de HCL Commerce para expandir sinónimos, la implementación de la expansión de sinónimos y sustituciones de Solr predeterminada, SynonymFilterFactory.

Antes de empezar

Cree una nueva clase de proveedor de expresión de búsqueda Java que expande un término de búsqueda en sus sinónimos. El código de ejemplo descargable siguiente (SolrSearchTermAssociationExpressionProvider.java) se puede utilizar como referencia:

Procedimiento

  1. Abra HCL Commerce Developer y cambie a la vista Explorador de empresa.
  2. Cree una carpeta nueva para su archivo de configuración de componente de búsqueda de HCL Commerce personalizado:
    1. Navegue hasta la vía de acceso siguiente:

      workspace_dir\WC\xml\config\

    2. En la carpeta config, añada una nueva carpeta com.ibm.commece.catalog-ext de modo que la vía de acceso sea parecida a la siguiente:

      workspace_dir\WC\xml\config\com.ibm.commece.catalog-ext\

      Si esta carpeta ya existe y contiene una versión personalizada del archivo wc-search.xml, abra el archivo y salte al paso 6.

  3. Navegue hasta la vía de acceso siguiente:

    workspace_dir\WC\xml\config\com.ibm.commerce.catalog-fep\

  4. Copie el archivo wc-search.xml en la nueva carpeta com.ibm.commece.catalog-ext que ha creado en el primer paso.
  5. Abra el archivo wc-search.xml copiado en un editor y suprímalo todo excepto las líneas siguientes, con objeto de obtener la versión personalizada del archivo wc-search.xml:
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    <_config:search-config
    xmlns:_config="http://www.ibm.com/xmlns/prod/commerce/foundation/config"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/xmlns/prod/commerce/foundation/config ../xsd/wc-search.xsd ">
    
    
    </_config:search-config> 
    
  6. Añada los perfiles nuevos siguientes a custom wc-search.xml, dentro del elemento <_config:search-config>:
    
    <_config:profile extends="IBM_findCatalogEntryByNameAndShortDescription" name="X_findCatalogEntryByNameAndShortDescription"  >
           <_config:query inherits="false">
                <_config:param name="maxRows" value="500"/>
                <_config:param name="maxTimeAllowed" value="3000"/>
                <_config:param name="debug" value="false"/>
                <_config:param name="preview" value="2"/>
                
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchProfileNameValidator"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchIndexNameValidator"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchIndexSynchronizer"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchBasedMerchandisingExpressionProvider"/>
                
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchTermAssociationExpressionProvider"/>
                
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByKeywordExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByCategoryExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByManufacturerExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByPriceExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByFacetExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByStorePathExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchByCustomExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchFacetConditionExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchTypeExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchMetaTokenExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchProductEntitlementExpressionProvider"/>
                <_config:provider classname="com.ibm.commerce.catalog.facade.server.services.search.expression.solr.SolrSearchExpressionValidator"/>
                
                <_config:field name="name"/>
                <_config:field name="defaultSearch"/>
                <_config:field name="shortDescription"/>
                <_config:field name="unstructure"/>
            </_config:query>
      </_config:profile>
      
      <_config:profile extends="X_findCatalogEntryByNameAndShortDescription" name="X_findCatalogEntryByNameAndShortDescriptionInDetail"/>
    
  7. Guarde y cierre el archivo personalizado.
  8. Para utilizar los perfiles nuevos en la tienda de inicio de Madisons:
    1. Abra el archivo siguiente en un editor
      • WC_eardir\Stores.war\WebContent\Madisons\Snippets\Search\SearchSetup.jspf
    2. Sustituya el fragmento de código siguiente:
      
      <c:set var="searchProfile" value="IBM_findCatalogEntryByNameAndShortDescription" scope="request"/> 
      
      With this snippet:
      
      <c:set var="searchProfile" value="X_findCatalogEntryByNameAndShortDescription" scope="request"/> 
      
    3. Sustituya el fragmento de código siguiente:
       
      <c:when test="${pageView == 'detailed' and searchProfile == 'IBM_findCatalogEntryByNameAndShortDescription'}">
      <c:set var="navigationView" value="getCatalogNavigationView" scope="request"/>
      <c:set var="searchProfile" value="IBM_findCatalogEntryByNameAndShortDescriptionInDetail" scope="request"/>
      </c:when> 
      
      With this snippet:
      
      <c:when test="${pageView == 'detailed' and searchProfile == 'X_findCatalogEntryByNameAndShortDescription'}">
      <c:set var="navigationView" value="getCatalogNavigationView" scope="request"/>
      <c:set var="searchProfile" value="X_findCatalogEntryByNameAndShortDescriptionInDetail" scope="request"/>
      </c:when> 
      
    4. Guarde y cierre el archivo.
  9. El proveedor de expresión de ejemplo sólo expande sinónimos. Si está modificado para manejar también sustituciones, el archivo synonyms.txt de Solr ya no es necesario. En dicho caso, puede modificar la configuración del Management Center para no llamar al servicio PostSave PublishSearchTermAssociations. Esto se puede realizar comentando la sección siguiente en WC_eardir dir_ear_WC\LOBTools.war\WebContent\config\commerce\catalog\objectDefinitions\SearchTermAssociationsPrimaryObjectDefinition.def como se indica a continuación:
    
    <!--
    <PostSaveService url="/cmc/PublishSearchTermAssociations">
    <ServiceParam name="storeId"/>
    </PostSaveService>
    --> 
    
  10. Comente el filtro SynonymFilterFactory para todos los campos de HCL Commerce definidos en schema.xml para cada núcleo. Por ejemplo, en solrhome\MC_10101\en_US\CatalogEntry\conf\schema.xml, en bold:
    
    <fieldType name="wc_text" class="solr.TextField" positionIncrementGap="100">
          <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt" />
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
          </analyzer>
          <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> -->
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt" />
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
          </analyzer>
        </fieldType>
       
        <!-- Spell checking text field -->
        <fieldType name="wc_textSpell" class="solr.TextField" positionIncrementGap="100">
      		<analyzer type="index">
        		<tokenizer class="solr.StandardTokenizerFactory"/>
        		<filter class="solr.LowerCaseFilterFactory"/>
        		<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        		<filter class="solr.StandardFilterFactory"/>
        		<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      		</analyzer>
      		<analyzer type="query">
        		<tokenizer class="solr.StandardTokenizerFactory"/>
        		<filter class="solr.LowerCaseFilterFactory"/>
        		<!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> -->
        		<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        		<filter class="solr.StandardFilterFactory"/>
        		<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      		</analyzer>
    </fieldType>