Я использую NEST для запроса к базе данных ELasticsearch, чтобы получить данные из некоторого GeoShape, нарисованного в пользовательском интерфейсе на карте Leaflet.Код моего сервера для выполнения этого запроса выглядит следующим образом:
Примечание: geoJsonFeature - это функция GeoJson, отправляемая из пользовательского интерфейса на сервер.Он относится к классу Feature , показанному ниже в коде.
public class Feature
{
public string type { get; set; }
public Properties properties { get; set; }
public Geometry geometry { get; set; }
}
var geometry = geoJsonFeature.geometry;
var type = geometry.type;
var coords = geometry.coordinates[0].Select(shapeArr =>
{
double lon = shapeArr[0];
double lat = shapeArr[1];
return new GeoCoordinate(lat, lon);
});
var polygon = new PolygonGeoShape(
new[]
{
coords
});
var result = dbClient.Search<MediaSummary>(s => s
.Index("mediasummary")
.Type(typeof(MediaSummary))
.Query(q =>
q.GeoShapePolygon(c => c
.Name("geoShape_query")
.Boost(1.1)
.Field(p => p.location)
.Coordinates(polygon.Coordinates)
.Relation(GeoShapeRelation.Intersects)
.IgnoreUnmapped(true)
)));
var count = result.Total;
var list= result.Documents.ToList();
Список всегда пуст, независимо от того, насколько большой я рисую многоугольник на карте.Я полагаю, что в моей серверной логике есть какая-то проблема.
Может кто-нибудь подсказать, что нужно сделать?
Обновление: Кто-то запросил отображение индекса и информацию DebugInformation.Вот они:
отображение индекса для медиасуммы
{
"mediasummary" : {
"aliases" : { },
"mappings" : {
"media" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"ClientID" : {
"type" : "integer"
},
"ClientStatus" : {
"type" : "integer"
},
"Duration" : {
"type" : "long"
},
"EndDate" : {
"type" : "date"
},
"FileSize" : {
"type" : "long"
},
"FileType" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"IsRestrictedView" : {
"type" : "boolean"
},
"MediaState" : {
"type" : "integer"
},
"MediaStatus" : {
"type" : "integer"
},
"properties" : {
"lat" : {
"type" : "float"
},
"logTime" : {
"type" : "date"
},
"lon" : {
"type" : "float"
},
"sensorEventId" : {
"type" : "long"
}
}
},
"StartDate" : {
"type" : "date"
},
"StationID" : {
"type" : "integer"
},
"UnitID" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"UserID" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"VideoID" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"location" : {
"type" : "geo_point"
}
}
}
},
"settings" : {
"index" : {
"refresh_interval" : "5s",
"number_of_shards" : "3",
"provided_name" : "mediasummary",
"creation_date" : "1548853211953",
"number_of_replicas" : "1",
"uuid" : "lwHHKK89RzuGn_LZ6DW4Nw",
"version" : {
"created" : "6050499"
}
}
}
}
}
DebugInformation
Unsuccessful low level call on POST: /mediasummary/media/_search?typed_keys=true
# Audit trail of this API call:
- [1] PingSuccess: Node: http://localhost:9200/ Took: 00:00:00.0599653
- [2] BadResponse: Node: http://localhost:9200/ Took: 00:00:01.2732751
# OriginalException: Elasticsearch.Net.ElasticsearchClientException: The remote server returned an error: (400) Bad Request.. Call: Status code 400 from: POST /mediasummary/media/_search?typed_keys=true. ServerError: Type: search_phase_execution_exception Reason: "all shards failed" ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.
at System.Net.HttpWebRequest.GetResponse()
at Elasticsearch.Net.HttpWebRequestConnection.Request[TResponse](RequestData requestData)
--- End of inner exception stack trace ---
# Request:
{"query":{"geo_shape":{"_name":"geoShape_query","ignore_unmapped":true,"location":{"relation":"intersects","shape":{"type":"polygon","coordinates":[[[66.995573,24.883649],[66.995573,24.883649],[66.979094,24.860911],[66.979094,24.860911],[67.004499,24.823369],[67.004499,24.823369],[67.024584,24.830691],[67.024584,24.830691],[67.074881,24.853746],[67.074881,24.853746],[67.04484,24.8796],[67.04484,24.8796],[67.027845,24.892525],[67.027845,24.892525],[66.995573,24.883649]]]}}}}}
# Response:
{"error":{"root_cause":[{"type":"query_shard_exception","reason":"Field [location] is not of type [geo_shape] but of type [geo_point]","index_uuid":"lwHHKK89RzuGn_LZ6DW4Nw","index":"mediasummary"}
Примечание.чувствительный к регистру вопрос в коде для поля «location», то есть класс POCO имеет его как «Location» вместо «location».Я исправил это и теперь представил его отображение и DebugInformation.
Теперь ясно видно, что ошибка имеет следующую причину:
Field [location] is not of type [geo_shape] but of type [geo_point]"
Но я не понимаю, что мне теперь делатьследующий?