Skip To Content

Hinzufügen von benutzerdefinierten Suchkriterien zur Suchseite

In diesem Thema

Hinzufügen benutzerdefinierter Suchkriterien

Es ist möglich, im Geoportal Suchergebnisse basierend auf bestimmten Metadatenelementen zu filtern. Sie können beispielsweise Dokumente mit bestimmten Begriffen im Titel abrufen, indem Sie sie der Suchabfrage im Suchfeld title:searchTerm voranstellen. Hier wird dann die Lucene-Indizierung angewendet, die Informationen in einem Metadatenelement mit einer Überschrift klassifiziert, nach der ein Benutzer suchen würde. Die Suchsyntax wird in Verwenden von Lucene-Suchtextabfragen näher erläutert.

Es ist außerdem möglich, diese angepasste Elementsuche als Suchfilter zur Liste der verfügbaren Suchoptionen, die im Dialogfeld Zusätzliche Optionen auf der Suchseite angezeigt werden, hinzuzufügen. In diesem Thema wird zunächst beschrieben, wie ein bestimmtes Element für die Suche festgelegt wird. Anschließend wird erklärt, wie diese Suche als benutzerdefinierter Suchfilter zum Dialogfeld Zusätzliche Optionen hinzugefügt wird.

Hinweis:

Wenn Sie die benutzerdefinierten Suchkriterien hinzufügen, können Sie mit Hilfe der Lucene-Syntax in der CS-W-Benutzeroberfläche auch das benutzerdefinierte Feld suchen. Durch Hinzufügen des benutzerdefinierten Felds wird der GetCapabilities-Vorgang von Geoportal jedoch nicht geändert. Die einzigen Eigenschaften, die explizit in GetCapabilities von Geoportal aufgelistet sind, sind räumliche Prädikate (z. B. BBOX, Intersects, Within).

Die Schritte zum Hinzufügen von benutzerdefinierten Suchkriterien werden in diesem Thema beschrieben.

Festlegen eines speziellen Elements für die Suche und Verifizieren der Indizierung

In diesem Abschnitt wird vorausgesetzt, dass Sie die Datei property-meanings.xml von Geoportal, wie in Details zur Lucene-Indizierung im Geoportal beschrieben, bereits kennen. In diesem Beispiel konfigurieren Sie das Geoportal, um ein Element aus dem INSPIRE-Metadatenschema, wie von der Datei inspire-iso-19115-definition.xml definiert, zu indizieren.

Tipp: Für diese Anpassung wird kein Quellcode des Geoportal Server benötigt. Sie erstellen dabei jedoch eine neue Javaklasse, Kenntnisse in der Java-Programmierung sind aus diesem Grund empfohlen. Falls Sie eine integrierte Entwicklungsumgebung (Integrated Development Environment, IDE) wie Eclipse zur Kompilierung neuer Klassen verwenden, denken Sie daran, die Datei "geoportal.war" bei der Entwicklung in Ihr Projekt zu importieren.

Identifizieren des Elements, das über "Zusätzliche Optionen" durchsuchbar sein soll

Möglicherweise haben Sie bereits ein Metadatenelement im Sinn, das Ihre Organisation über die Benutzeroberfläche Zusätzliche Optionen durchsuchbar machen möchte. Es ist wichtig, dieses Element in einem oder mehreren Metadatenprofilen, die Ihr Geoportal unterstützt, zu lokalisieren. Überprüfen Sie, ob Sie das Metadatenelement finden können, indem Sie es in den definition.xml-Dateien (aus den \\geoportal\WEB-INF\classes\gpt\metadata-Unterordnern) oder in einem Profil in der Metadateneditor-Benutzeroberfläche des Geoportals lokalisieren. In diesem Beispiel fügen wir einen Suchfilter für das Feld Herkunft eines ISO-Metadatendokuments zur Suchoberfläche Zusätzliche Optionen hinzu. Starten Sie das Geoportal, und melden Sie sich als Publisher oder Administrator an, um das Herkunftsfeld im Metadateneditor des Geoportals anzuzeigen. Klicken Sie anschließend auf die Registerkarte Verwaltung und dann auf den Link Hinzufügen. Wählen Sie die Option Speziellen Editor zum manuellen Erstellen von Metadaten verwenden und anschließend das Profil INSPIRE (Daten) aus. Suchen Sie im Formular nach dem Abschnitt mit der Bezeichnung Qualität&Gültigkeit. In diesem Abschnitt sehen Sie das Metadatenelement Herkunft.

Bestimmen, ob das ausgewählte Element bereits standardmäßig indiziert ist

Wenn das Element, das Sie über die Oberfläche Zusätzliche Optionen suchen möchten, in einem der Standard-Metadateneditoren des Geoportals angezeigt wird, ist das Element wahrscheinlich bereits standardmäßig indiziert. Wenn Sie jedoch ein benutzerdefiniertes Metadatenprofil mit neuen Metadatenparametern erstellt oder neue Metadatenelemente zu den Standardeditoren hinzugefügt haben, müssen Sie die Indizierung für das Element möglicherweise definieren. Folgen Sie dazu den Anweisungen im Abschnitt "Bestimmen, ob das ausgewählte Element bereits standardmäßig indiziert ist" unter Details zur Lucene-Indizierung im Geoportal. Nachdem Sie diesen Abschnitt gelesen haben und den Empfehlungen für die Indizierung des ausgewählten Elements gefolgt sind, sollten Sie eine Lucene-Abfrage in das Suchfeld auf der Suchseite des Geoportals eingeben und relevante Ergebnisse abrufen können.

Hinzufügen des neuen Suchelements zum Dialogfeld "Zusätzliche Optionen"

In diesem Task bereiten Sie Ihr Suchelement für die Suche und Anzeige im Dialogfeld Zusätzliche Optionen vor. Beachten Sie, dass unser neues suchbares Element in diesem Beispiel, Herkunft, ein Textfeld ist. Wenn Ihr neues Element ein Datumsfeld oder ein Feld mit Mehrfachauswahl ist, sollten die Schritte unten an den Typ des Feldes angepasst werden.

Erstellen einer neuen Klasse für den neuen Suchfilter

Der kompilierte Geoportal-Code enthält bereits Klassen für die Standardsuchoptionen, die im Dialogfeld Zusätzliche Optionen angezeigt werden. Um Ihren zusätzlichen Filter in das Dialogfeld einzubeziehen, müssen Sie eine neue Klasse erstellen, die dem Geoportal Informationen über das Element liefert. Die neue Klasse muss die Schnittstelle ISearchFilter implementieren oder eines der untergeordneten Elemente von ISearchFilter erweitern/implementieren. Sie können der neuen Klasse einen beliebigen Namen geben, wenn Sie jedoch der Benennungsregel der anderen Suchfilterklassen innerhalb des Geoportals folgen möchten, muss der Name der Klasse SearchFilter<Name_Ihres_Indizierungs_felds>.java lauten. Der unten gezeigte Code ist ein Beispiel für eine Klasse, die für das Hinzufügen unseres Beispielherkunftselements verwendet werden könnte. Nachdem Sie die neue Klasse erstellt und kompiliert haben, legen Sie die Klassendatei in das Verzeichnis \\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");
} 
} 
}

Speichern von Instanzen Ihrer neuen Klasse in den Geoportal-Sitzungsvariablen

Suchparameter und deren Werte werden in Sitzungsvariablen gespeichert. Diese Variablen werden erstellt, wenn ein Benutzer die erste Webseite der Website aufruft. Diese Variablen bleiben dann erhalten, bis der Benutzer den Browser schließt oder über einen bestimmten Zeitraum keine Webabfragen erstellt. Die JavaServer Faces-Umgebung, auf der Geoportal Server aufgebaut ist, verfügt über eine Konfigurationsdatei, in der Sitzungsvariablen gespeichert sind. Diese Datei befindet sich im Verzeichnis \\geoportal\WEB-INF und heißt gpt-faces-config.xml. Sie muss an zwei Stellen hochgeladen werden.

  • Fügen Sie unter dem Abschnitt <!- - Search Beans - -> die folgende neue, verwaltete Bean hinzu, um Ihre neuen Variablen in der Sitzung zu speichern. Beachten Sie, dass wir im Beispiel unten auf unser Herkunftselement verweisen. Dies muss bearbeitet werden, sodass es dem Element, für das Sie die Suche anpassen, entspricht:
    <!--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>
  • In der managedProperty mit der Bezeichnung miscelleniousFilters müssen einige Änderungen vorgenommen werden. Überprüfen Sie, ob die Wertklasse auf com.esri.gpt.catalog.search.ISearchFilter festgelegt ist. Fügen Sie der Werteliste einen Wert hinzu, der auf Ihre neue verwaltete Bean verweist. Im Beispiel unten haben wir die Zeile <value>#{SearchFilterLineage}</value> hinzugefügt:
    <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>

Überschreiben der Abfrage-Servlet-Klasse

Damit Ihre benutzerdefinierte Suche über die Suchseite funktioniert, muss sie auch über die REST URL funktionieren. Die Klasse RestQueryServlet ist der Controller für REST-Suchabfragen und sollte überschrieben werden. Der Code unten wird zur Erstellung der Klasse angezeigt, die die RestQueryServlet-Klasse überschreibt. Öffnen Sie einen Texteditor, und kopieren Sie die Zeilen unten hinein. Speichern Sie die Datei im Ordner \\geoportal\WEB-INF\classes\gpt\search unter CustomRestQueryServlet.java.

Hinweis:

In diesem Beispiel sehen Sie, dass Herkunft der Name des abfragbaren Rests ist. Sie müssen dies für das Element, das Sie suchen möchten, aktualisieren.

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

Aktualisieren der web.xml des Geoportals, sodass sie auf die neue queryServlet-Klasse verweist

Navigieren Sie zum Ordner \\geoportal\WEB-INF, und öffnen Sie die Datei web.xml in einem Texteditor. Suchen Sie die <servlet>-Referenz, deren <servlet-name> auf RestQueryServlet festgelegt ist. Aktualisieren Sie ihre <servlet-class> von com.esri.gpt.control.georss.RestQueryServlet auf gpt.search.CustomRestQueryServlet, wie unten dargestellt. Speichern Sie dann die Datei.

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

Anpassen der Webseite "Zusätzliche Optionen"

Die Datei criteria.jsp definiert die Pop-up-Oberfläche für Zusätzliche Optionen auf der Suchseite. Nachdem Sie den Filter erstellt und die zugrunde liegende Arbeit für die Referenzierung im Geoportal erledigt haben, ist es wichtig, das Feld zu dieser Suchoberfläche hinzuzufügen. Führen Sie die folgenden Schritte aus.

  • Navigieren Sie zum Verzeichnis \\geoportal\catalog\search, und öffnen Sie die Datei "criteria.jsp" in einem Texteditor.
  • Suchen Sie in der Datei criteria.jsp den Abschnitt, in dem die Suche nach dem Änderungsdatum definiert ist. Der benutzerdefinierte Suchfeldcode muss direkt unter dem gesamten <%//modification date %>-Abschnitt eingefügt werden. Beachten Sie, dass der Wert, der für outputText id=scLbl definiert wurde, eine Zeichenfolge ist, auf die in der Datei gpt.properties verwiesen werden muss. Diese Zeichenfolge definiert die Beschriftung Ihres Feldes in der Oberfläche Zusätzliche Optionen.
  • Fügen Sie nach dem letzten </h:panelGroup>-Tag im Änderungsdatumsabschnitt Folgendes ein (ersetzt hier Ihr Element für das Herkunftelement):
    <% // 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" />
  • Unten in der Datei criteria.jsp finden Sie einen Abschnitt, in dem die Suchoptionen im Dialogfeld Zusätzliche Optionen näher definiert werden. Fügen Sie einen Wert für Ihre neu hinzugefügte Suchoption hinzu, und zwar wie unten gezeigt unter dem h:inputHidden id="scSelThemeHidden"-Tag in der Liste. Beachten Sie, dass die ID für Ihr inputHidden-Tag der ID im <h:inputText>-Element im ersten Codeausschnitt, den Sie dieser Datei hinzugefügt haben, ähneln sollte. In unserem Beispiel für das inputText-Element war die ID scLineage. Bei diesem h:inputHidden-Element ist die ID 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}"/>
  • Führen Sie in der Datei criteria.jsp einen Bildlauf nach oben durch, um die JavaScript-Funktion scReadRestUrlParams() zu suchen. Fügen Sie die Parameter Ihres Metadatenelements (in unserem Beispiel Herkunft), die an die erstellten REST-URLs angehängt werden, hinzu:
    function scReadRestUrlParams() {
    …
    var scLineage = GptUtils.valChkStr(
    dojo.byId('frmSearchCriteria:scLineageHidden').value);
    if(scText != "") {
    restParams += "&lineage=" + encodeURIComponent(scLineage);
    }
    … 
    }
  • Speichern Sie die Datei criteria.jsp.

Aktualisieren von gpt.properties mit einer Beschriftung für den neuen Suchfilter

  • Navigieren Sie zum Verzeichnis \\geoportal\WEB-INF\classes\gpt\resources, und öffnen Sie die Datei gpt.properties in einem Texteditor.
  • Suchen Sie nach dem Abschnitt, in dem die Suchfilter definiert sind. Schlüssel für Suchfilter beginnen mit der Zeichenfolge catalog.search.filter…
  • Fügen Sie einen neuen Wert hinzu. Dieser Wert sollte der Zeichenfolge scLbl, die Sie in Ihrem h:outputText id=scLbl-Element aus der Datei criteria.jsp definiert haben, entsprechen. In unserem Beispiel fügen wir Folgendes hinzu:
    catalog.search.filterLineage.title = Lineage
  • Speichern Sie die Datei "gpt.properties".

Starten Sie die Geoportal-Webanwendung neu, damit die Änderungen wirksam werden. Sie sollten das Dialogfeld Zusätzliche Optionen starten und ein Feld für Ihren neuen Suchfilter sehen können. Wenn Sie Text für diesen Filter eingeben, auf ok und anschließend auf die Schaltfläche Suchen klicken, sollten die Ergebnisse Ihren Eingabetext in dieses Element des Metadatendokuments enthalten.