Indexierung von ArcGIS Server Layern

smart.finder ermöglicht es Ihnen, Layer eines ArcGIS Feature- oder Kartenservice zu indexieren. Hierzu müssen Sie das Indexierungsschema anpassen, sowie eine Abbildung der Attribute eines Feature-Types in das Solr-Schema erstellen. Das folgende Beispiel zeigt Ihnen die notwendigen Schritte.

smart.finder Server wird mit einem vorkonfigurierten ArcGIS Feature-Service Setup ausgeliefert. Dieses besteht aus:

  • Einem Solr Core mit vorkonfiguriertem Schema (smartsearch)

  • Einer Beispiel-App namens full-screen-map-multicore

Sowohl das Indexierungsschema als auch die Layer-Konfiguration sind bereits für das Indexieren eines Layers "Points of Interest in der Stadt Münster" mit insgesamt 18739 Features vorbereitet. Sie können dieses Beispiel als Blaupause für die Einrichtung weiterer Layer benutzen. In den folgenden Abschnitten wird im Einzelnen erläutert, was hierfür zu tun ist.

Datenbasis

Nehmen wir an, dass Sie einen ArcGIS Server Layer "Points of Interest in der Stadt Münster" indexieren wollen. Ein Feature dieses Layers hat folgende Felder:

  • FID (type: esriFieldTypeOID, alias: FID, SQL Type: sqlTypeOther, length: 0, nullable: false, editable: false)

  • osm_id (type: esriFieldTypeString, alias: osm_id, SQL Type: sqlTypeOther, length: 10, nullable: true, editable: true)

  • code (type: esriFieldTypeSmallInteger, alias: code, SQL Type: sqlTypeOther, nullable: true, editable: true)

  • fclass (type: esriFieldTypeString, alias: fclass, SQL Type: sqlTypeOther, length: 28, nullable: true, editable: true)

  • name (type: esriFieldTypeString, alias: name, SQL Type: sqlTypeOther, length: 100, nullable: true, editable: true)

  • Shape__Area (type: esriFieldTypeDouble, alias: Shape__Area, SQL Type: sqlTypeDouble, nullable: true, editable: false)

  • Shape__Length (type: esriFieldTypeDouble, alias: Shape__Length, SQL Type: sqlTypeDouble, nullable: true, editable: false)

Die Felder osm_id, code und name sollen bei der Indexierung der Features berücksichtigt werden.

Anpassung des Solr-Schemas

smart.finder wird mit einem vorkonfigurierten Core für diesen Anwendungsfall ausgeliefert. Der smartsearch Core liegt im Verzeichnis

/{smartfinder_server_name}/WEB-INF/solr.home/smartsearch

Das zugehörige Solr-Schema wird in der schema.xml-Datei beschrieben.

schema.xml für den smartsearch Core:
<fields>
    <field name="identifier" type="string"   indexed="true" stored="true" required="false" multiValued="true"/>
    <field name="title" type="text"     indexed="true" stored="true" required="false" multiValued="false"/>
    <field name="layer" type="text"     indexed="true" stored="true" required="false" multiValued="false"/>
    [...]
    <field name="poi_name" type="text"   indexed="true" stored="true" required="false" multiValued="false"/>
    <field name="poi_code" type="text"   indexed="true" stored="true" required="false" multiValued="false"/>

    <!-- copy to search field -->
    <copyField source="identifier" dest="full_text"/>
    <copyField source="title" dest="full_text"/>
    <copyField source="layer" dest="full_text"/>
    <copyField source="poi_name" dest="full_text"/>
    <copyField source="poi_code" dest="full_text"/>
    [...]
</fields>

Von den in der schema.xml-Datei angegebenen Feldern (identifier, title, layer usw.) sind die folgenden Felder obligatorisch:

layer

Speichert den Namen des indexierten Layers

title

Speichert den Titel, der für die explizite Darstellung der Suchergebnisse genutzt wird

Sie können weitere Felder je nach indexiertem ArcGIS Service Layer analog zum oben genannten Vorgehen hinzufügen.

Verknüpfung zwischen ArcGIS Server Layer und Solr-Schema

Die Verknüpfung zwischen den Feldern des Layers und dem Solr-Schema wird in der Datei /smartfinder-search/WEB-INF/classes/spring-feature-layer-config.xml hergestellt. Einen Ausschnitt aus dieser Datei zeigt das folgende Listing:

spring-feature-layer-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    <!-- Default layer configuration that can reused for all layer configurations -->
    <bean class="de.conterra.finder.api.arcgis.arcgisserver.LayerConfiguration" name="defaultIndexingConfiguration">
        <property name="arcGISServerUrl" value="..."/>
        [...]
    </bean>
    <util:list id="layerConfigurations">
        <!-- Configuration for indexing feature layer with id 0 -->
        <bean class="de.conterra.finder.api.arcgis.arcgisserver.LayerConfiguration" name="layerConfigurationFederalStates">
            <!-- The parent configuration that should be used -->
            <constructor-arg name="parentConfiguration" ref="defaultIndexingConfiguration"/>
            <!-- Layer id of the layer that should be indexed -->
            <property name="id" value="0"/>
            <!-- Name of that will appear in the UI (faceted search)-->
            <property name="descriptiveName" value="POIs Münster"/>
            [...]
        </bean>
        <!-- Configuration of new custom layer -->
        <bean class="de.conterra.finder.api.arcgis.arcgisserver.LayerConfiguration" name="layerCustomFeatureServer">
            [...]
        </bean>
    </util:list>
</beans>

Der oben angegebene Ausschnitt und das in der Auslieferung enthaltene, lauffähige Beispiel zeigen Ihnen, wie Sie die Namen der Felder des Layers auf die Felder des Solr-Schemas abbilden können.

Der zentrale Teil der Konfiguration ist die Definition von LayerConfiguration-Objekten. Eine LayerConfiguration beschreibt wie ein bestimmter Layer indiziert werden soll. In einer LayerConfiguration wird beispielsweise definiert, welche Felder eines ArcGIS Server-Dienstes in das Solr-Schema übernommen werden. Ein LayerConfiguration-Objekt muss als bean-Element innerhalb des Elements <util:list id="layerConfigurations">..</util:list> aufgeführt werden, damit dieses für die Indexierung genutzt werden kann.

Vererbung von Einstellungen

Häufig kommt es vor, dass zum Beispiel mehrere Layer in einem ArcGIS Service die gleichen Felder enthalten. Für die einzelnen LayerConfiguration-Objekte müssten in einem solchen Fall immer wieder dieselben Konfigurationseinstellungen wiederholt werden. Um dies zu vereinfachen, kann eine LayerConfiguration die Konfiguration einer übergeordneten LayerConfiguration erben. LayerConfiguration-Objekte mit sich wiederholenden Einstellungen können somit wesentlich kompakter definiert werden. Eine konkrete LayerConfiguration kann weiterhin Werte überschreiben, die sie von der übergeordneten LayerConfiguration geerbt hat.

Wie im oben angegebenen Beispiel ersichtlich wird das bean-Element für die übergeordnete LayerConfiguration außerhalb des <util:list id="layerConfigurations">..</util:list>-Elements definiert. In die bean-Elemente innerhalb des <util:list id="layerConfigurations">..</util:list>-Elements, die die Konfiguration erben sollen, wird das folgende Element eingefügt:

<constructor-arg name="parentConfiguration" ref="defaultIndexingConfiguration"/>

Der Wert des ref-Attributs verweist dabei auf den Namen der übergeordneten Konfiguration.

Parameter einer LayerConfiguration

Die Parameter für eine LayerConfiguration werden in der Regel in einzelnen property-Elementen innerhalb des bean-Elementes der LayerConfiguration angegeben. Jedes property-Element hat dabei ein name- und ein value-Attribut, die den Namen und den Wert des Parameters enthalten.

Folgende Parameter können Sie für die LayerConfiguration einstellen. Die Angabe erforderlich bedeutet, dass dieser Wert entweder in der LayerConfiguration oder einer referenzierten übergeordneten LayerConfiguration gesetzt werden muss.

name (erforderlich)

Eindeutiger Name der LayerConfiguration. Der Name wird über das name-Attribut des zugehörigen bean-Elements eingestellt.

Beispiel:

<bean class="de.[...].LayerConfiguration" name="<NAME_DER_KONFIGURATION>"> [...] </bean>
arcGISServerUrl (erforderlich)

URL des ArcGIS Feature- oder Kartenservice.

Beispiel:

<property name="arcGISServerUrl" value="http://example.de/FeatureServer"/>
indexedFieldsToSchemaMapping (erforderlich)

Abbildung der Felder des Layers auf die Felder des Solr-Schemas.

Innerhalb eines map-Elements wird für jedes Layer-Feld ein entry-Element mit den folgenden Attributen definiert:

key Der Name des Feldes im Layer

value Der Name des Feldes im Solr-Schema

Beispiel:

<property name="indexedFieldsToSchemaMapping">
    <map>
        <entry key="osm_id" value="identifier"/>
        <entry key="code" value="poi_code"/>
        <entry key="name" value="poi_name"/>
    </map>
</property>

Die Felder osm_id, code und name sind Attribute des Feature-Layers. Die zugehörigen Felder identifier, poi_code und poi_name sind die Namen der Felder wie sie im Index lauten sollen.

titleFields (erforderlich)

Definiert die Zusammensetzung des Titelfeldes. Das Titelfeld wird verwendet, um die Treffer in der Suchbox anzuzeigen.

Die folgende Konfiguration erzeugt für ein Feature mit den Werten name="Straßen" und code="0428" den Titel "- Strassen (0428)":

 <property name="titleFields">
    <list>
        <bean class="de.conterra.finder.api.arcgis.arcgisserver.TitleField">
            <property name="name" value="name"/>
            <property name="postDelimiter" value=" ("/>
            <property name="preDelimiter" value="- "/>
        </bean>
        <bean class="de.conterra.finder.api.arcgis.arcgisserver.TitleField">
            <property name="name" value="code"/>
            <property name="postDelimiter" value=")"/>
        </bean>
    </list>
</property>

Die Properties preDelimiter und postDelimiter geben die Zeichen an, die dem Wert des mit der name-Property angegebenen Feldes jeweils voran oder hintangestellt werden.

pageSize

Maximale Anzahl angefragter Features pro Request gegen den ArcGIS Feature- oder Kartenservice.

Wenn dieser Wert nicht gesetzt ist, wird der global für den Indexierungsservice arcgisServerContentIndexingService konfigurierte Wert aus der Datei /smartfinder-search/WEB-INF/classes/spring-indexing-config.xml verwendet.

Standardwert: 50

Beispiel:

<property name="pageSize" value="50"/>
indexGeometry

Legt fest, ob auch die Geometry eines Features indexiert werden soll.

Standardwert: true

Beispiel:

<property name="indexGeometry" value="true"/>
translateDomainValues

Legt fest, ob existierende Domain-Werte von Features als Namen im Index berücksichtigt werden sollen.

Bei false wird lediglich der Code eines Feldes übernommen.

Standardwert: false

Beispiel:

<property name="translateDomainValues" value="false"/>

Indexierung des Layers

Um den Layer zu indexieren, müssen Sie im Job-Manager einen Indexierungsjob für eine Ressource vom Typ URL anlegen.

Die URL dieses Jobs zeigt auf den Feature-Service Layer, den Sie zuvor in der Layer-Konfiguration definiert haben. Bezogen auf diese lautet die URL: <arcGISServerUrl>/<id>.

Nach dem Start des Jobs werden die Felder des Layer entsprechend der Konfiguration indexiert.

Falls der Feature-Layer den Fehler-Code Error: Error performing query operation während der Indexierung zurückgibt, ist es möglich, dass die Heap-Size der SOCs im ArcGIS Server zu gering ist, um die Feature-Response komplett bereitzustellen.

Sie können das auf zwei verschiedene Wege lösen:

Ergebnis der Indexierung

  1. Um die Ergebnisse zu sehen, öffnen Sie die Beispielapp: https://<yourserver>/smartfinder/?lang=de&app=full-screen-map-multicore.

  2. Wählen Sie den smart search Core:

    map.app Smart Search Core Auswahl
  3. Nach Eingabe des Suchbegriffs Schule stellt sich das Suchergebnis wie folgt dar:

    Suchergebnis
  4. Ein Klick auf ein Suchergebnis in der Liste zeigt das Feature in der Karte an.