Elasticsearch point в запросе многоугольника - PullRequest
0 голосов
/ 28 апреля 2019

Я использую Elasticsearch V6.7.1.

Я создал несколько индексов и наполнил их данными. у каждого индекса есть поле gps_coords со значениями lat and lon` (координаты)

Что я хочу сделать, это написать запрос, в котором я передаю многоугольник и проверяю, попадает ли определенная точка в этот многоугольник, это возможно?

Это запрос, который я уже пробовал:

{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
             "filter": {
                "geo_shape": {
                    "location": {
                        "shape": {
                            "type": "polygon",
                            "coordinates" : [
                                [25.0245351, 54.5693374], 
                                [25.0245351, 54.83232],
                                [25.4815808, 54.83232],
                                [25.4815808, 54.5693374],
                                [25.0245351, 54.5693374]
                              ]
                        },
                        "relation": "within"
                    }
                }
            }
        }
    }
}

Но он возвращает эту ошибку:

{
  "error": {
    "root_cause": [
      {
        "type": "parse_exception",
        "reason": "Invalid LinearRing found. Found a single coordinate when expecting a coordinate array"
      }
    ],
    "type": "parse_exception",
    "reason": "Invalid LinearRing found. Found a single coordinate when expecting a coordinate array"
  },
  "status": 400
}

Вот мое отображение индекса:

[
            'index' => 'places',
            'body' => [
                'mappings' => [
                    'place' => [
                        "properties" => [
                            "gps_coords" => [
                                "ignore_malformed" => true,
                                "type" => "geo_shape"
                            ]
                        ]
                    ],

                ],
                "number_of_replicas" => 0
            ]
        ]
    ];

Может кто-нибудь, пожалуйста, укажите мне правильное направление.
Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Да, извините, мой плохой, просто скопировал пример из документации ES, а не мой код.Окей, попробую добавить эти скобки и посмотрим, поможет ли это, спасибо!

0 голосов
/ 29 апреля 2019

Во-первых, в примере запроса вы используете поле location вместо gps_coords, как уже указано в комментарии.Но я считаю, что это просто опечатка, потому что это не источник ошибки.

Причина, по которой вы получаете исключение синтаксического анализа, заключается в том, что вы пропускаете одну пару скобок в определении многоугольника в запросе geo_shape.Смотрите правильную форму здесь .Правильная форма будет (только соответствующая часть):

"shape": {
    "type": "polygon",
    "coordinates" : [
        [[25.0245351, 54.5693374], 
         [25.0245351, 54.83232],
         [25.4815808, 54.83232],
         [25.4815808, 54.5693374],
         [25.0245351, 54.5693374]]
    ]
}
...