sigsys|dk


Blog om udvikling

Opgradering af blog

udgivet 7/14/2016 3:10:00 PM

Jeg har brugt dagen i dag på at opgradere min blog, da jeg over en længere periode (5-6 måneder) har rodet med at få geopoints ind i mit log system. Hertil skulle jeg bruge en opgradering af:

  1. kibana
  2. elasticsearch
  3. logstash

Finten i at få geopoints registreret i elasticsearch (og senere kibana) er at have en property ved navn "location", påsat ens objekt, som bliver skrevet ned i Elasticsearch, og husk at det skal være med lille. Grunden til at det skal være med lille er, at man ellers ikke efterfølgende kan bruge NEST til at opdatere felterne på, da NEST altid lowercaser:

_client.Update<HttpLogEntry, object>(u => u
  .Index(hit.Index)
  .Id(hit.Id)
  .Type("logentry")
  .Doc(fieldsToUpdate)
  .DocAsUpsert());

Hvor min _client er instantieret således

var uri = new Uri(hostUrl);
var settings = new Nest.ConnectionSettings(uri);
            
_client = new Nest.ElasticClient(settings);

fieldsToUpdate ser i mit tilfælde således ud

new
{
  Location = new Location { Lat = location.Latitude.Value, Lon = location.Longitude.Value },
  CityName = location.CityName,
  ContinentName = location.ContinentName,
  CountryName = location.CountryName
}

Location klassen er bare en simpel klasse med to properties

class Location
{
  public double Lat { get; set; }
  public double Lon { get; set; }
}

Her ses tydeligt at Location er med stort. Problemet er at Update på NEST klienten lowercaser location. Jeg har ikke fundet ud af en måde at omgåes dette på. Jeg endte med at lave min mappings om, så den ser således ud:

{
    "order": 0,
    "template": "*_log-*",
    "settings": {
      "index": {
        "number_of_shards": "1"
      }
    },
    "mappings": {
      "logentry": {
        "dynamic_templates": [
          {
            "default_string": {
              "mapping": {
                "analyzer": "standard",
                "type": "string",
                "fields": {
                  "raw": {
                    "index": "not_analyzed",
                    "type": "string"
                  }
                }
              },
              "match_mapping_type": "string",
              "match": "*"
            }
          }
        ],
        "properties":{
          "location": {
            "type": "geo_point"
          }
        }
      }
    },
    "aliases": {}
  }

Her har jeg tilføjet

"properties":{
    "location": {
    "type": "geo_point"
    }
}

Hvor location er skrevet med småt.

I Kibana ser med min geopoint således ud:

{
  "lat": 40.7143,
  "lon": -74.006
}

I kibana og elasticsearch. HUSK for gudsskyld at lat og lon skal være med lille. Jeg tror ikke nødvendigvis at lat og lon felterne skal være tal, da jeg har set eksempler rundt omkring på nettet, hvor lat og lon er skrevet som strings, tal giver bare mest mening i mit hoved. Jeg mener ikke at rækkefølgen er af betydning, DOG ved jeg at rækkefølgen har betydning, hvis man vælger at bruge et array til. Læs mere her, under afsnittet "Geo-points expressed as an array or string".

Når man opretter en tile map visualization skal man huske at gå indunder options og checke "WMS compliant map server" til for at få et verdenskort, da mapquest pr. 2016-07-11 har forbudt unlimited brug af deres service. Kibana har endnu ikke fundet en løsning herpå, men jeg gætter på at der snart kommer en opdatering, så man kan bruge mapquests frie plan, som tillader en vis antal requests pr. dag. Hertil skal man dog kunne angive en api nøgle.