NEST Получить данные из базы данных Elasticsearch с помощью запроса GeoShape для Polygon - PullRequest
0 голосов
/ 01 апреля 2019

Я использую 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]"

Но я не понимаю, что мне теперь делатьследующий?

...