Skip To Content

Ajouter des critères de recherche personnalisés à la page de recherche

Ajouter des critères de recherche personnalisés

Dans le géoportail, il est possible de filtrer les résultats de recherche en fonction de certains éléments de métadonnées. Par exemple, vous pouvez extraire des documents dont le titre comporte des termes spécifiques en ajoutant en préfixe title:searchTerm à la requête de recherche dans le champ Rechercher. Ceci est rendu possible grâce à l’index de Lucene, qui classifie les informations dans un élément de métadonnées par un en-tête en fonction duquel l’utilisateur effectue la recherche. La syntaxe de la recherche est abordée en détail dans la Utilisation des requêtes textuelles de recherche Lucene.

Il est possible d’ajouter cette recherche d’éléments personnalisée en tant que filtre de recherche à la liste des options de recherche disponibles qui s’affichent dans la boîte de dialogue Options supplémentaires de la page Rechercher. Cette rubrique va d’abord décrire comment désigner un élément spécifique à rechercher, puis comment ajouter cette recherche à la boîte de dialogue Options supplémentaires en tant que filtre de recherche personnalisé.

Remarque :

Lorsque vous ajoutez les critères de recherche personnalisés, vous pouvez également rechercher le champ personnalisé à l’aide de la syntaxe Lucene dans l’interface CS-W. Toutefois, l’ajout du champ personnalisé ne modifie pas l’opération GetCapabilities du géoportail ; les seules propriétés explicitement répertoriées dans l’opération GetCapabilities du géoportail sont les prédicats spatiaux (par exemple, BBOX, Intersects, Within).

La procédure d’ajout d’un critère de recherche personnalisé est expliquée dans cette rubrique.

Désigner un élément particulier à rechercher et vérifier qu’il est indexé

Cette section part du principe que vous possédez une connaissance de base du fichier property-meanings.xml du géoportail, tel qu’il est décrit à la rubrique Informations sur l’indexation Lucene dans le géoportail. Dans cet exemple, vous allez configurer le géoportail afin d’indexer un élément à partir de la structure de métadonnées INSPIRE, telle que définie par le fichier inspire-iso-19115-definition.xml.

Astuce : cette personnalisation ne nécessite pas le code source du composant Geoportal Server. Néanmoins, comme vous allez créer une nouvelle classe Java au cours de cette personnalisation, il est recommandé d’avoir une connaissance de la programmation Java. Si vous utilisez un environnement de développement intégré (IDE, tel qu’Eclipse) pour compiler la nouvelle classe, n’oubliez pas d’importer le fichier geoportal.war dans votre projet au cours du développement.

Identifier l’élément qui pourra faire l’objet d’une recherche à partir des options supplémentaires

Il est probable que vous avez déjà une idée de l’élément de métadonnées que votre organisation souhaite pouvoir rechercher à partir de l’interface Options supplémentaire. Il est important d’être en mesure de localiser cet élément dans un ou plusieurs des profils de métadonnées pris en charge par votre géoportail. Vérifiez que vous pouvez retrouver l’élément de métadonnées, soit en le localisant dans les fichiers definition.xml (situés dans les sous-dossiers \\geoportal\WEB-INF\classes\gpt\metadata), soit à partir d’un profil dans l’interface de l’éditeur de métadonnées du géoportail. Dans cet exemple, nous allons ajouter un filtre de recherche pour le champ Lineage d’un document de métadonnées ISO à l’interface de recherche Options supplémentaires. Pour voir le champ Lineage dans l’éditeur de métadonnées du géoportail, lancez le géoportail et connectez-vous en tant qu’éditeur ou administrateur. Cliquez ensuite sur l’onglet Administration et sur le lien Ajouter. Sélectionnez l’option Utiliser l'éditeur dédié pour créer manuellement les métadonnées, puis choisissez le profil INSPIRE (Données). Parcourez le formulaire jusqu’à la section intitulée Qualité et Validité. Dans cette section, vous verrez l’élément de métadonnées Lineage.

Déterminer si l’élément choisi est déjà indexé par défaut

Si l’élément que vous souhaitez rechercher à partir de l’interface Options supplémentaires apparaît dans un des éditeurs de métadonnées par défaut du géoportail, il est probable que cet élément est déjà indexé par défaut. Toutefois, si vous avez créé un profil de métadonnées personnalisé avec de nouveaux paramètres de métadonnées, ou si vous avez ajouté de nouveaux éléments de métadonnées aux éditeurs par défaut, vous devrez peut-être définir l’indexation de l’élément. Suivez les indications données dans la section "Déterminer si l’élément choisi est déjà indexé par défaut" de la rubrique Informations sur l’indexation Lucene dans le géoportail. Après avoir lu cette section et suivi les recommandations concernant l’indexation de l’élément choisi, vous devez être en mesure de saisir une requête Lucene pour votre élément dans le champ de recherche de la page de recherche du géoportail et de récupérer les résultats pertinents.

Ajouter le nouvel élément de recherche à la boîte de dialogue Options supplémentaires

Au cours de cette tâche, vous allez préparer votre élément pour le rechercher et l’afficher dans la boîte de dialogue Options supplémentaires. Notez que dans cet exemple, notre nouvel élément à rechercher, lineage, est un champ de texte. Si votre nouvel élément est un champ de type date ou de multi-sélection, la procédure ci-dessous doit être adaptée au type de champ.

Créer une nouvelle classe pour le nouveau filtre de recherche

Le code compilé du géoportail inclut déjà des classes pour les options de recherche par défaut vues dans la boîte de dialogue Options supplémentaires. Pour intégrer votre filtre supplémentaire dans la boîte de dialogue, vous devez créer une nouvelle classe destinée à fournir au géoportail des informations sur votre élément. La nouvelle classe doit implémenter l’interface ISearchFilter ou étendre/implémenter un des enfants de ISearchFilter. Vous pouvez donner le nom qui vous convient à la nouvelle classe, mais si vous souhaitez suivre la convention d’affectation de noms des classes des autres filtres de recherche appartenant au géoportail, le nom de votre classe doit être : SearchFilter<nom_de_votre_champ_indexation>.java. Le code illustré ci-dessous est un exemple de classe pouvant servir à ajouter notre élément lineage d’exemple. Une fois la nouvelle classe créée et compilée, placez le fichier de classe obtenu dans le répertoire \\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");
} 
} 
}

Stocker les instances de votre nouvelle classe dans les variables de session du géoportail

Les paramètres de recherche et leurs valeurs sont stockés dans des variables de session. Ces variables sont créées lorsqu’un utilisateur charge la première page Web du site et elles sont conservées jusqu’à ce que l’utilisateur ferme le navigateur ou s’il ne crée pas de requêtes Web pendant un certain temps. La structure JavaServer Faces, sur laquelle repose le composant Geoportal Server, possède un fichier de configuration dans lequel les variables de session sont stockées. Ce fichier se trouve dans le répertoire \\geoportal\WEB-INF et s’appelle gpt-faces-config.xml. Vous devez mettre à jour ce fichier à deux endroits.

  • Sous la section intitulée <!- - Search Beans - ->, ajoutez le nouveau managed-bean suivant pour stocker vos nouvelles variables dans la session. Notez que dans l’exemple ci-dessous, nous faisons référence à notre élément d’exemple Lineage ; vous devez remplacer ce texte par l’élément pour lequel vous personnalisez la recherche :
    <!--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>
  • Dans la propriété managedProperty appelée miscelleniousFilters, vous devez apporter certaines modifications. Vérifiez que l’attribut value-class est défini surcom.esri.gpt.catalog.search.ISearchFilter. Dans la liste des valeurs, ajoutez une valeur qui fait référence à votre nouveau managed-bean. Dans l’exemple ci-dessous, nous ajoutons la ligne <valeur>#{SearchFilterLineage}</valeur> :
    <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>

Remplacer la classe Servlet de la requête

Pour que votre recherche personnalisée fonctionne à partir de la page de recherche, elle doit également fonctionner à partir de l’URL REST. La classe RestQueryServlet est le contrôleur des recherches REST et doit être remplacée. Le code ci-dessous illustre la création de la classe qui est destinée à remplacer la classe RestQueryServlet. Ouvrez un éditeur de texte et copiez les lignes ci-dessous. Enregistrez le fichier sous le nom CustomRestQueryServlet.java, dans le dossier \\geoportal\WEB-INF\classes\gpt\search.

Remarque :

Dans cet exemple, vous voyez que lineage est le nom de la requête REST. Vous devez utiliser à la place le nom de l’élément que vous souhaitez rechercher.

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;
}
}

Mettre à jour le fichier web.xml du géoportail pour désigner la nouvelle classe queryServlet

Accédez au dossier \\geoportal\WEB-INF et ouvrez le fichier web.xml dans un éditeur de texte. Recherchez la référence <servlet> dont l’attribut <servlet-name> est défini sur RestQueryServlet. Modifiez la valeur <servlet-class> de com.esri.gpt.control.georss.RestQueryServlet en gpt.search.CustomRestQueryServlet, comme indiqué ci-dessous. Enregistrez ensuite le fichier.

<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>

Adapter la page Web Options supplémentaires

Le fichier criteria.jsp définit l’interface contextuelle de la fenêtre Options supplémentaires sur la page Rechercher. Maintenant que vous avez créé le filtre et réalisé les tâches sous-jacentes visant à le référencer dans le géoportail, il est important d’ajouter le champ à cette interface de recherche. Suivez les étapes ci-dessous.

  • Accédez au répertoire \\geoportal\catalog\search et ouvrez le fichier criteria.jsp dans un éditeur de texte.
  • Dans le fichier criteria.jsp, recherchez la section dans laquelle la recherche de la date de modification est définie. Vous allez insérer votre code du champ de recherche personnalisé juste au-dessous de la section <%//modification date %> entière. Notez que la valeur définie pour outputText id=scLbl est une chaîne qui doit être référencée dans le fichier gpt.properties. Cette chaîne définit l’étiquette de votre champ dans l’interface Options supplémentaires.
  • A la suite de la balise </h:panelGroup> finale dans la section de la date de modification, insérez ce qui suit (en utilisant votre élément à la place de lineage) :
    <% // 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" />
  • Au bas du fichier criteria.jsp, une section définit plus en détail les options de recherche de la boîte de dialogue Options supplémentaires. Affectez une valeur à l’option de recherche que vous venez d’ajouter, sous la balise h:inputHidden id="scSelThemeHidden" de la liste, comme illustré ci-dessous. Notez que l’identifiant de la balise inputHidden doit être le même que celui de l’élément <h:inputText> dans la première partie de code que vous avez ajoutée à ce fichier. Dans notre exemple pour l’élément inputText, l’identifiant était scLineage. Dans cet élément h:inputHidden, l’identifiant sera 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}"/>
  • Remontez dans le fichier criteria.jsp jusqu’à la fonction Javascript scReadRestUrlParams(). Ajoutez les paramètres de l’élément de métadonnées (lineage dans notre exemple) qui seront ajoutés aux URL REST générées :
    function scReadRestUrlParams() {
    …
    var scLineage = GptUtils.valChkStr(
    dojo.byId('frmSearchCriteria:scLineageHidden').value);
    if(scText != "") {
    restParams += "&lineage=" + encodeURIComponent(scLineage);
    }
    … 
    }
  • Enregistrez le fichier criteria.jsp.

Modifier gpt.properties en attribuant une étiquette à votre nouveau filtre de recherche

  • Accédez au répertoire \\geoportal\WEB-INF\classes\gpt\resources et ouvrez le fichier gpt.properties dans un éditeur de texte.
  • Recherchez la section où sont définis les filtres de recherche. Les clés des filtres de recherche commencent par la chaîne catalog.search.filter…
  • Ajoutez une nouvelle valeur. Cette valeur doit correspondre à la chaîne scLbl que vous avez définie dans votre élément h:outputText id=scLbl du fichier criteria.jsp. Dans notre exemple, nous ajoutons ce qui suit :
    catalog.search.filterLineage.title = Lineage
  • Enregistrez le fichier gpt.properties.

Redémarrez l’application Web du géoportail pour que vos modifications prennent effet. Vous devez être en mesure de lancer la boîte de dialogue Options supplémentaires et un champ correspondant à votre nouveau filtre de recherche doit s’afficher. Lorsque vous saisissez du texte pour ce filtre et cliquez sur OK, puis sur le bouton de recherche, les résultats doivent contenir le texte que vous avez saisi dans cet élément du document de métadonnées.