Skip To Content

Agregar criterios de búsqueda personalizados a la página de búsqueda

Agregar criterios de búsqueda personalizados

En el geoportal, es posible filtrar los resultados de búsqueda con base en ciertos elementos de metadatos. Por ejemplo, puede recuperar documentos con términos específicos en el título al agregar prefijos a la consulta de búsqueda en el campo Búsqueda con título:searchTerm. Se habilita por medio del índice Lucene, el que clasifica la información en un elemento de metadatos con un encabezado que el usuario buscaría. La sintaxis de búsqueda se analiza detalladamente en Uso de consultas de texto de búsqueda Lucene.

Además, es posible agregar esta búsqueda de elementos personalizada como un filtro de búsqueda en la lista de opciones de búsqueda disponibles que se muestra en el cuadro de diálogo Opciones adicionales en la página Búsqueda. Este tema primero describirá la manera en que se designa un elemento específico de búsqueda y luego, cómo agregar esta búsqueda al cuadro de diálogo Opciones adicionales como un filtro de búsqueda personalizada.

Nota:

Cuando agrega los criterios de búsqueda personalizada, también puede buscar el campo personalizado mediante la sintaxis lucene en la interfaz CS-W. Sin embargo, agregar el campo personalizado no altera la operación GetCapabilities del geoportal; las únicas propiedades que se enumeran explícitamente en GetCapabilities del geoportal son los predicados espaciales (p. ej., BBOX, Intersecar, Dentro).

En este tema se tratan los pasos para agregar criterios de búsqueda personalizada.

Designar un elemento específico de búsqueda y verificar si está indizado

En esta sección se asume que usted tiene una comprensión inicial del archivo property-meanings.xml del geoportal como se describe en Detalles de indexación de Lucene en el geoportal. En este ejemplo, configurará el geoportal para indizar un elemento en el esquema de metadatos de INSPIRE, según se define en el archivo inspire-iso-19115-definition.xml.

Sugerencia: Esta personalización no requiere del código de origen del servidor del Geoportal; sin embargo, usted creará una nueva clase Java en esta personalización, por lo que se recomienda tener conocimientos de programación Java. Si usa un entorno de desarrollo integrado (IDE, como Eclipse) para compilar la nueva clase, recuerde importar el archivo geoportal.war a su proyecto mientras lo desarrolla.

Identificar el elemento que desea que se pueda buscar en Opciones adicionales

Es probable que ya tenga en mente un elemento de metadatos que a su organización le gustaría que se pueda buscar en la interfaz Opciones adicionales. Es importante que pueda ubicar este elemento en uno o más perfiles de metadatos compatibles con el geoportal. Verifique que puede buscar el elemento de metadatos, ya sea en los archivos definition.xml (en las subcarpetas \\geoportal\WEB-INF\classes\gpt\metadata) o en un perfil en la interfaz del editor de metadatos del geoportal. En este ejemplo, agregaremos un filtro de búsqueda para el campo Linaje de un documento de metadatos ISO para la interfaz de búsqueda Opciones adicionales. Para ver el campo Linaje en el editor de metadatos del geoportal, inicie el geoportal e inicie sesión como un usuario con permisos de responsable de la publicación o un administrador. A continuación, haga clic en la pestaña Administración y luego en el vínculo Agregar. Seleccione la opción Usar un editor dedicado para crear metadatos manualmente y después seleccione el perfil INSPIRE (Datos). Desplácese a través del formulario y busque la sección titulada Calidad y Validez. En esta sección, verá el elemento de metadatos Linaje.

Determinar si el elemento elegido ya está indizado de manera predeterminada

Si el elemento que usted desea buscar en la interfaz Opciones adicionales aparece en uno de los editores de metadatos predeterminados del geoportal, es probable que este elemento ya esté indizado de manera predeterminada. Sin embargo, si creó un perfil de metadatos personalizado con nuevos parámetros de metadatos o agregó nuevos elementos de metadatos a los editores predeterminados, probablemente deba definir el indexado del elemento. Para obtener más información vea la sección "Determinar si el elemento elegido ya está indexado de manera predeterminada" en el tema Detalles indización de Lucene en el Geoportal. Después de leer esa sección y llevar a cabo las recomendaciones sobre cómo indizar el elemento elegido, podrá introducir una consulta lucene para el elemento en el campo de búsqueda de la página Búsqueda del geoportal y recuperar los resultados relevantes.

Agregar el nuevo elemento de búsqueda al cuadro de diálogo Opciones adicionales

En esta tarea, preparará el elemento de búsqueda para buscarlo y visualizarlo en el cuadro de diálogo Opciones adicionales. Tenga en cuenta en este ejemplo, que nuestro nuevo elemento a buscar, linaje, es un campo de texto. Si su nuevo elemento es un campo de fecha o un campo de selección múltiple, los pasos a continuación se deben adaptar al tipo de campo.

Crear una nueva clase para el nuevo filtro de búsqueda

El código compilado del geoportal ya incluye clases para las opciones de búsqueda predeterminada que se ven en el cuadro de diálogo Opciones adicionales. Para incluir el filtro adicional en el cuadro de diálogo, deberá crear una nueva clase que proporcione información al geoportal sobre el elemento. La nueva clase debe implementar la interfaz ISearchFilter o ampliar o implementar uno de los elementos secundarios de ISearchFilter. Puede usar cualquier nombre para su nueva clase, pero si desea seguir la convención de nomenclatura de las otras clases de filtro de búsqueda dentro del geoportal, el nombre de su clase debe ser SearchFilter<name_of_your_indexing_field>.java. El código que se muestra a continuación es un ejemplo de una clase que podría usar para agregar el elemento de ejemplo de linaje. Después de crear y compilar la nueva clase, coloque el archivo de la clase resultante en el directorio \\geoportal\WEB-INF\classes\gpt\search\.

package gpt.search;  import com.esri.gpt.catalog.search.ISearchFilter;  import com.esri.gpt.catalog.search.SearchException; import com.esri.gpt.catalog.search.SearchParameterMap;  import com.esri.gpt.catalog.search.SearchParameterMap.Value; import com.esri.gpt.framework.util.Val; @SuppressWarnings("serial")  public class SearchFilterLineage implements ISearchFilter {   // key to be used to serialize class to a map  private static String KEY_LINEAGE = "lineage";   // instance variable  private String lineage;  // property (Can be used by jsf(advanced search page)  public String getLineage() {  return Val.chkStr(lineage); }  // property (Can be used by jsf(advanced search page)  public void setLineage(String lineage) {  this.lineage = lineage;  }  // Serialize class instance into a map  public SearchParameterMap getParams() {  SearchParameterMap map = new SearchParameterMap();  map.put(KEY_LINEAGE, map.new Value(this.getLineage(), "")); return map; } // The class may receive a new map for deserialization (e.g. saved searches  // can trigger this  public void setParams(SearchParameterMap parameterMap) throws SearchException {  Value val = parameterMap.get(KEY_LINEAGE); this.setLineage(val.getParamValue());  } // Deep comparison of filters  public boolean isEquals(Object obj) { if (obj instanceof SearchFilterLineage) {  return ((SearchFilterLineage) obj).getLineage().equals(this.getLineage());  }  return false;  }  // This will be called by the clear button  public void reset() {  this.setLineage("");  }  // Before search, validate will be called. An exception can be thrown  // that will stop the search and the error is displayed on the search page  public void validate() throws SearchException { if (this.getLineage().equals("this should throw an exception")) { throw new SearchException("this should throw an exception"); }  }  }

Almacenar instancias de su nueva clase en las variables de sesión del geoportal

Los parámetros de búsqueda y sus valores se almacenan en las variables de la sesión. Estas variables se crean cuando un usuario carga la primera página Web del sitio y luego las variables permanecen hasta que el usuario cierra el explorador o no crea alguna de las solicitudes de la Web en cierto tiempo. El marco de JavaServer Faces, sobre el que está construido el servidor del Geoportal, cuenta con un archivo de configuración en donde se almacenan las variables de la sesión. Este archivo se encuentra en el directorio \\geoportal\WEB-INF y se llama gpt-faces-config.xml. Deberá actualizar este archivo en dos lugares.

  • Bajo la sección con el título <!- - Search Beans - ->, agregue el siguiente nuevo bean administrado para almacenar las nuevas variables en la sesión. Tenga en cuenta que en el ejemplo a continuación, hacemos referencia a nuestro elemento Linaje; deberá editarlo para que coincida con el elemento para el que está personalizando la búsqueda:
    <!--managed bean for lineage search--> <managed-bean> <description>Search Filter with lineage properties</description> <managed-bean-name>SearchFilterLineage</managed-bean-name> <managed-bean-class>gpt.search.SearchFilterLineage</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>
  • En el managedProperty denominado miscelleniousFilters, deberá realizar algunas modificaciones. Verifique que la clase valor se establezca encom.esri.gpt.catalog.search.ISearchFilter. En la lista de valores, agregue un valor que haga referencia a su nuevo bean administrado. En el siguiente ejemplo, agregamos la línea <value>#{SearchFilterLineage}</value>:
    <managed-property> <property-name>miscelleniousFilters</property-name> <property-class> com.esri.gpt.catalog.search.SearchFiltersList </property-class> <list-entries> <value-class> com.esri.gpt.catalog.search.ISearchFilter </value-class> <value>#{SearchFilterHarvestSites}</value> <value>#{SearchFilterLineage}</value> </list-entries> </managed-property>

Invalidar la clase servlet de consultas

Para que su búsqueda personalizada funcione en la página de consulta, debe funcionar también en la dirección REST URL. La clase RestQueryServlet es el controlador de las búsquedas REST y se debe invalidar. El siguiente código se muestra para crear la clase que invalidará la clase RestQueryServlet. Abra un editor de texto y copie las líneas que aparecen a continuación. Guarde el archivo como CustomRestQueryServlet.java, en la carpeta \\geoportal\WEB-INF\classes\gpt\search.

Nota:

En este ejemplo, verá que linaje es el nombre del resto que se puede consultar. Deberá actualizarlo para el elemento que desea buscar.

package gpt.search; import javax.servlet.http.HttpServletRequest; import com.esri.gpt.catalog.discovery.rest.RestQuery; import com.esri.gpt.catalog.discovery.rest.RestQueryParser; import com.esri.gpt.catalog.search.SearchCriteria; import com.esri.gpt.control.georss.RestQueryServlet; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.util.Val; public class CustomRestQueryServlet extends RestQueryServlet { private static String REST_PARAM_KEY = "lineage"; //Relate the rest queryable to the CSW queryables  protected RestQuery parseRequest(HttpServletRequest request, RequestContext context) { RestQuery query = super.parseRequest(request, context); RestQueryParser parser = new RestQueryParser(request,context,query); // "lineage" will be the name of the rest queryable parser.parsePropertyIsLike(REST_PARAM_KEY, "dc:lineage"); /** The below is shown as an example parser.parseRepositoryId("rid"); parser.parseResponseFormat("f"); parser.parseResponseGeometry("geometryType"); parser.parseResponseStyle("style"); parser.parseResponseTarget("target"); parser.parseStartRecord("start",1); parser.parseMaxRecords("max",10); parser.parsePropertyIsEqualTo("uuid","uuid"); parser.parsePropertyIsLike("searchText","anytext"); parser.parsePropertyList("contentType","dc:type",",",true); parser.parsePropertyList("dataCategory","dc:subject",",",true); parser.parsePropertyRange("after","before","dct:modified"); parser.parseSpatialClause("bbox","spatialRel","geometry"); parser.parseSortables("orderBy"); **/ return query; } //Populate the searchCriteria with the rest queryable protected SearchCriteria toSearchCriteria(HttpServletRequest request,  RequestContext context, RestQuery query) { SearchCriteria criteria = super.toSearchCriteria(request, context, query); RestQueryParser parser = new RestQueryParser(request,context, query); String sLineage = Val.chkStr(parser.getRequestParameter(REST_PARAM_KEY)); if (sLineage.length() > 0) { SearchFilterLineage filterLineage = new SearchFilterLineage(); filterLineage.setLineage(sLineage); criteria.getMiscelleniousFilters().add(filterLineage); } return criteria; } }

Actualización de web.xml del geoportal para indicar la nueva clase queryServlet

Navegue hasta la carpeta \\geoportal\WEB-INF y abra el archivo web.xml en un editor de texto. Busque la referencia <servlet> con el <servlet-name> que se estableció en RestQueryServlet. Actualice su <servlet-class> desde com.esri.gpt.control.georss.RestQueryServlet a gpt.search.CustomRestQueryServlet, como se muestra a continuación. Después, guarde el archivo.

<servlet> <servlet-name>RestQueryServlet</servlet-name> <servlet-class>gpt.search.CustomRestQueryServlet</servlet-class> <init-param> <param-name>bundleBaseName</param-name> <param-value>gpt.resources.gpt</param-value> </init-param> <load-on-startup>6</load-on-startup> </servlet>

Adaptar la página Web Opciones adicionales

El archivo criteria.jsp define la interfaz emergente para las Opciones adicionales de la página Búsqueda. Ahora que creó el filtro y realizó el trabajo subyacente para lograr que el geoportal haga referencia a esto, es importante agregar el campo a esta interfaz de búsqueda. Siga los pasos a continuación.

  • Navegue hasta el directorio \\geoportal\catalog\search y abra el archivo criteria.jsp en el editor de texto.
  • En el archivo criteria.jsp, encontrará la sección que define la búsqueda de fecha modificada. Inserte el código del campo de búsqueda personalizada justo abajo de la sección <%//modification date %>. Tenga en cuenta que el valor definido para el outputText id=scLbl será una cadena de caracteres que deberá tener referencia en el archivo gpt.properties. Esta cadena de caracteres define la etiqueta de su campo en la interfaz Opciones adicionales.
  • Después de la etiqueta final </h:panelGroup> en la sección de fecha de modificación, inserte lo siguiente (sustituya su elemento por linaje aquí):
    <% // lineage (added) %> <h:outputText id="txtClearHtml" escape="false" value=" "/> <h:outputText escape="false" value="<h3>"/> <h:outputText id="scLblLineage" value="#{gptMsg['catalog.search.filterLineage.title']}" /> <h:outputText escape="false" value="</h3>"/> <h:inputText id="scLineage" onchange="javascript:updateHiddenValue(this)" value="#{SearchFilterLineage.lineage}" maxlength="4000" styleClass="searchBox" />
  • Cerca del final del archivo criteria.jsp, hay una sección que define con más detalle las opciones de búsqueda en el cuadro de diálogo Opciones adicionales. Agregue un valor a la opción de búsqueda que agregó recientemente, debajo de la etiqueta h:inputHidden id="scSelThemeHidden" en la lista, como se muestra a continuación. Tenga en cuenta que la Id. de su etiqueta inputHidden debe ser similar a la id del elemento <h:inputText> en la primera parte del código que agregó a este archivo. En nuestro ejemplo del elemento inputText, la Id era scLineage. En este elemento h:inputHidden, la Id será scLineageHidden:
    <h:outputText escape="false" value="</div>"/>  <h:inputHidden id="scSelSortHidden" value="#{SearchFilterSort.selectedSort}"/>  <h:inputHidden id="scDateToHidden" value="#{SearchFilterTemporal.dateModifiedTo}"/>  <h:inputHidden id="scDateFromHidden" value="#{SearchFilterTemporal.dateModifiedFrom}"/>  <h:inputHidden id="scSelContentHidden" value="#{SearchFilterContentTypes.selectedContentType}"/>  <h:inputHidden id="scSelThemeHidden" value="#{SearchFilterThemeTypes.selectedThemes}">  <h:inputHidden id="scLineageHidden" value="#{SearchFilterLineage.lineage}"/>
  • Desplácese hacia arriba del archivo criteria.jsp para buscar la función javascript scReadRestUrlParams(). Agregue los parámetros del elemento de metadatos (linaje, en nuestro ejemplo) que se incorporarán a las direcciones REST URL generadas:
    function scReadRestUrlParams() { … var scLineage = GptUtils.valChkStr( dojo.byId('frmSearchCriteria:scLineageHidden').value); if(scText != "") { restParams += "&lineage=" + encodeURIComponent(scLineage); } …  }
  • Guarde el archivo criteria.jsp.

Actualizar gpt.properties con una etiqueta del nuevo filtro de búsqueda

  • Navegue hasta el directorio \\geoportal\WEB-INF\classes\gpt\resources y abra el archivo gpt.properties en el editor de texto.
  • Busque la sección que define los filtros de búsqueda. Las claves para los filtros de búsqueda inician con la cadena de caracteres catalog.search.filter…
  • Agregue un valor nuevo Este valor debe coincidir con la cadena de caracteres scLbl que definió en el elemento h:outputText id=scLbl del archivo criteria.jsp. En nuestro ejemplo, agregamos lo siguiente:
    catalog.search.filterLineage.title = Lineage
  • Guarde el archivo gpt.properties.

Reinicie la aplicación Web del geoportal para que los cambios tengan efecto. Podrá iniciar el cuadro de diálogo Opciones adicionales y ver el campo del nuevo filtro de búsqueda. Cuando introduzca texto en ese filtro y haga clic en aceptar, luego haga clic en el botón búsqueda, los resultados deberán contener el texto que introdujo en ese elemento del documento de metadatos.