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 dasname
-Attribut des zugehörigenbean
-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 einentry
-Element mit den folgenden Attributen definiert:key
Der Name des Feldes im Layervalue
Der Name des Feldes im Solr-SchemaBeispiel:
<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
undname
sind Attribute des Feature-Layers. Die zugehörigen Felderidentifier
,poi_code
undpoi_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"
undcode="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
undpostDelimiter
geben die Zeichen an, die dem Wert des mit dername
-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>
.
Für das vorgefertigte Beispiel lautet die URL: https://services.arcgis.com/ObdAEOfl1Z5LP2D0/arcgis/rest/services/poi_muenster_WFL1/FeatureServer/0
Nach dem Start des Jobs werden die Felder des Layer entsprechend der Konfiguration indexiert.
Falls der Feature-Layer den Fehler-Code Sie können das auf zwei verschiedene Wege lösen:
|
Ergebnis der Indexierung
-
Um die Ergebnisse zu sehen, öffnen Sie die Beispielapp:
https://<yourserver>/smartfinder/?lang=de&app=full-screen-map-multicore
. -
Wählen Sie den smart search Core:
-
Nach Eingabe des Suchbegriffs
Schule
stellt sich das Suchergebnis wie folgt dar: -
Ein Klick auf ein Suchergebnis in der Liste zeigt das Feature in der Karte an.