Configurer - Une recherche basée sur un index Elasticsearch¶
Permettre d’interroger un index Elasticsearch à partir d’une saisie libre (exemple « Port de Brest »). Le résultat retourné est une collection de documents disposant d’un champ commun avec les entités géographiques servies par l’instance WMS/WFS. Par convention les types elasticsearch ont le même nom que les couches WMS/WFS.
Prérequis¶
Installer une instance Elasticsearch https://www.elastic.co/fr/downloads/elasticsearch.
Création des indexs¶
Depuis la version 7, il faut un index par couche mviewer
Commencé par créer un index nommé comme votre layerid avec un champ de type geo_shape nommé geometry et un champ de type keyword nommé id.
Pour celà, depuis le serveur hôte hébergeant l’instance Elasticsearch, lancer la commande CURL suivante :
$ curl -XPUT 'localhost:9200/layerid?pretty' -d '{
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"geometry": {
"type": "geo_shape",
"tree": "quadtree",
"precision": "10m"
},
"id": {
"type": "keyword"
}
}
}
}'
Alimenter l’index avec des données¶
Il existe plusieurs mode d’alimentation. Un des plus connus consiste en l’utilisation de logstash https://www.elastic.co/downloads/logstash. et du plugin jdbc https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html. permettant d’indexer des données provenant de bases de données.
Une autre méthode consiste à utiliser l’API d’indexation d’Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docs-bulk.html. via une commande CURL et un fichier contenant les instructions et données d’indexation et les données. Le fichier démo lycee permet de rapidement alimenter un index avec les données des lycées bretons.
Télécharger le fichier lycee http://kartenn.region-bretagne.fr/doc/lycee.bulk.json. et exécuter la commande suivante.
$ curl -s -H "Content-Type: application/x-ndjson" -XPOST 'http://localhost:9200/_bulk' --data-binary "@lycee.bulk.json"
Tester l’index¶
Si tout s’est bien déroulé, la commande suivante doit renvoyer deux lycées :
$ curl -XGET 'localhost:9200/layerid?q=zola&pretty'
Pour logstash et une récupération des données directement depuis une base de données, il faut créer un fichier de configuration dans /etc/logstash/conf.d, par exemple layerid.conf
exemple
input {
jdbc {
jdbc_connection_string =>"jdbc:postgresql://hostname:port/bddname"
jdbc_user =>"user"
jdbc_password => "paswword"
jdbc_driver_class => "org.postgresql.Driver"
statement => "SELECT **(champ_souhaitées dont clé primaire au mina)**, ST_AsEWKT(ST_TRANSFORM(geom, 4326)) as geometry from schemaname.tablename WHERE geom IS NOT NULL"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_fetch_size => "10000"
#schedule => "* * * * *"
}
}
filter {
mutate {
split => { "geometry" => ";" }
add_field => { "location" => "%{[geometry][1]}" }
remove_field => [ "geometry" ]
}
}
output {
elasticsearch {
hosts => ["http://localhost"]
index => "LAYERID"
document_id => "%{cle_primaire_jointure}"
}
}
Attention les données indexées dans elasticsearch sont toujours en 4326
Puis lancer l’indexation :
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/LAYERNAME.conf
Connecter mviewer à cet index Elasticsearch¶
Il est conseillé de n’exposer que l’API de recherche (_search) sur le web. Imaginons qu’une configuration serveur expose sur le web “localhost:9200/layerid/_search” en “http://monserveur/els/layerid/_search”
En partant de la démo Elasticsearch : http://kartenn.region-bretagne.fr/kartoviz/demo/els.xml, modifier le fichier de configuration pour que l’application pointe sur l’index Elasticsearch précédemment créé.
Syntaxe
<elasticsearchs>
<elasticsearch url="http://monserveur/els/_search" geometryfield="geometry" linkid="search_id" querymode="match" mouseoverfields="id, name" displayfields="id, name" layer="layerid"/>
</elasticsearchs>
Attributs
url
: URL de l’API Searchgeometryfield
: nom du champ utilisé par l’instance elasticsearch pour stocker la géométrielinkid
: nom du champ à utiliser côté serveur wms/wfs pour faire le lien avec la propriété _id des documents elasticsearchquerymode
(optionnel) : mode de requête utilisé par elasticsearch pour trouver le résultat. Valeurs possibles match, term ou phrase - default = match. Le mode match convient pour la recherche libre et naturelle. Le mode phrase permet de faire des recherches sur une phrase et le mode terme permet de faire une recherche sur un terme exact. Il est à noter que l’utilisateur peut activer le mode terme en préfixant sa recherche de # et activer le mode phrase en encadrant sa recherche de « « .version
(optionnel) : version de l’instance elasticsearch (exemple = 5.3)geometryformat
(optionnel) : par défaut GeoJson. Valeurs possibles GeoJson ou WKT en fonction du format dans elasticsearchmouseoverfields
(optionnel) : liste d’attributs à afficher au survol de l’entité dans le résultat recherche (les champs doivent être disponibles dans l’indexation)displayfields
(optionnel) : liste d’attributs à afficher sur la liste des entités dans le résultat de recherche (les champs doivent être disponibles dans l’indexation)layer
(optionnel) : layerid de la couche côte mviewer
@Deprecated
* doctypes
(optionnel) : types des documents elasticsearch à requêter systématiquement, indépendamment des couches affichées
Tester en lançant http://monserveur/mviewer/?config=demo/els.xml et saisir zola dans la barre de recherche.