Manual (Da) APIElasticsearch

Elasticsearch

Elasticsearch er en distribueret, multitenant-capable full-text søgemaskine med et RESTful web interface og schema-løse JSON dokumenter. Det er ikke kun fantastisk til søgning, men også til at skabe værdi ud af alle de data en virksomhed samler.

I GC2 har vi lavet et API for 1) at få data fra PostGIS til Elasticsearch på en meget enkel måde og 2) at eksponere Elasticsearchs API på en sikker måde.

Få data fra PostGIS til Elasticsearch

Det er nemt at hente data fra PostGIS til Elasticsearch. Det er faktisk bare et klik på en knap. Men først kan du opsætte mapping mellem PostGIS feltertyper og Elasticsearch felttyper.

  1. Vælg hvilken tabel (eller anden type af relation) du vil indeksere i Elasticsearch.
  2. Klik på fanen Elasticsearch i nederste panel.
  3. Kolonnen Native PG-type viser felttyperne i PostGIS. Elasticsearch type kolonnen viser de foreslåede typer i Elasticsearch. Sidstnævnte du kan ændre ved at dobbeltklikke på en værdi.
  4. Kolonnerne Index til Format angiver, hvordan værdierne skal indekseres, analyseres, formateres osv. Se længere nede for yderligere oplysninger om opsætning af brugerdefinerede analyzers.
  5. Klik på (Re)index in Elasticsearch for at indeksere dataene. Hvis indekset eksisterer, slettes og indekseres det igen.
  6. Du kan slette et indeks ved at klikke på Slet fra Elasticsearch.

Efter indeksering kan du søge på indekseret på dette endpoint:

https://host.com/api/v2/elasticsearch/search/[database]/[schema]/[table]

Du kan se mapping dokumentet ved at kalde denne:

https://host.com/api/v2/elasticsearch/map/[database]/[schema]/[table]?key=[your API key]

Det egentlige indeks i Elasticsearch vil blive navngivet: database_schema_table

Dokumentstrukturen ii Elasticsearch

De indekserede dokumenter er formateret som GeoJSON. Et eksempel på et GeoJSON dokument:

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands"
  }
}

Eksponering af Elasticsearch search API

GC2 eksponerer kun Search API'et i Elasticsearch. Du kan bruge GC2's API som du ville bruge Search API i Elasticsearch.

Nedenfor er et eksempel på en GET med en URI search. De følgende eksempler bruger cURL-programmet, men enhver HTTP-klient kan bruges.

curl -i --header "Content-Type: application/json" -X GET \
"https://gc2.io/api/v2/elasticsearch/search/dk/matrikel/jordstykke_view?q=properties.string1:Engelsholm&size=1&pretty"

Og her med en request body. Body kan sendes som enten GET og POST. Sidstnævnte kan bruges til klienter, der ikke kan GET med body. For eksempel web browsere: 

curl -i --header "Content-Type: application/json" -X GET \
https://gc2.io/api/v2/elasticsearch/search/dk/matrikel/jordstykke_view --data \
'{
    "query": {
        "match" : {
            "properties.string1" : "Engelsholm"
        }
    }
}'

Opsæt Elasticsearch indeksindstillinger og tilføj brugerdefinerede analyzers

Hvis du hoster din egen GC2 server kan du opsætte Elasticsearch index settings herunder brugerdefinerede analyzers og search analyzers. Analyzers kan herefter vælges i GC2 Admin.

På GC2-serveren oprettes et dokument kaldet app/conf/elasticsearch_settings.json, som udfyldes  med indeksindstillingerne:

{
  "settings": {
    "number_of_shards": 4,
    "analysis": {
      "analyzer": {
        "str_search_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": ["lowercase"]
        },
        "str_index_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "substring"
          ]
        }
      },
      "filter": {
        "substring": {
          "type": "edgeNGram",
          "min_gram": 1,
          "max_gram": 255
        }
      }
    }
  }
}

Alle nye indekser vil blive oprettet med disse indstillinger.