отображение геополигона Elastic Search / Kibana 5.3

У меня 20000 файлов geojson в этом формате:

{
    "geometry": {
        "type": "Polygon",
        "coordinates": [
            [
                [long,lat],
                [long,lat],
                [long,lat],
                [long,lat],
                [long,lat]
            ]
        ]
    },

Все сопоставления, которые я пытался выполнить с помощью geo_shape и geo_point, либо не отображаются в Кибане, либо отображаются в Кибане, но без данных. Как лучше всего сопоставить это для индексации многих файлов? (Если нет хорошего способа, моей следующей мыслью было создать центральную точку для каждого файла, если я не могу использовать все координаты. Возможно, возьмем первый массив long, lat и сделаем центральную точку geo_point для каждого файла json. Не уверен, как пойти об этом тоже)

Это отображение по умолчанию из ES, когда я индексирую, ничего не меняя:

{
  "indexname" : {
    "mappings" : {
      "my_type" : {
        "properties" : {
          "geometry" : {
            "properties" : {
              "coordinates" : {
                "type" : "float"
              },
              "type" : {
                "type" : "text",
                "fields" : {
                  "keyword" : {
                    "type" : "keyword",
                    "ignore_above" : 256
                  }
                }
              }
            }
          },

ОБНОВЛЕНИЕ Вот мое новое сопоставление:

{
  "indexname" : {
    "mappings" : {
      "my_type" : {
        "properties" : {
          "geometry" : {
            "type" : "geo_shape",
            "tree" : "quadtree",
            "precision" : "1.0m"
          },
          "id" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },

Однако, когда я иду в кибану, я все еще получаю сообщение об ошибке при попытке визуализации на расширенной тайловой карте:

No Compatible Fields: The "indexname" index pattern does not contain any of the following field types: geo_point

EDIT2 Это моя команда для создания сопоставления:

curl -XPUT "http://localhost:9200/indexname" -d "{\"mappings\" : {\"my_type\" : {\"properties\" : {\"geometry\" : {\"type\":\"geo_shape\", \"tree\": \"quadtree\", \"precision\": \"1m\"}}}}}"

Я индексирую свои файлы, просматривая и отправляя почтовый запрос:

r = requests.post(url_of_index, data=file(jsonfiles).read()) 

Когда я пытаюсь изменить тип на geo_point, а затем проиндексировать свои файлы, я сталкиваюсь с исключением парсера сопоставителя.


person user6754289    schedule 14.04.2017    source источник


Ответы (1)


Что вам нужно сделать, так это создать собственное сопоставление, содержащее geo_shape, поскольку ES не делает вывод из ваших документов GeoJSON сам по себе.

PUT indexname
{
  "mappings": {
    "my_type": {
      "properties": {
        "geometry": {
          "type": "geo_shape",
          "tree": "quadtree",
          "precision": "1m"
        }
      }
    }
  }
}

После создания этого индекса и сопоставления вы сможете индексировать свои файлы GeoJSON:

PUT indexname/my_type/1
{
  "geometry": {
    "type": "Polygon",
    "coordinates": [
        [
            [long,lat],
            [long,lat],
            [long,lat],
            [long,lat],
            [long,lat]
        ]
    ]
  }
}

ОБНОВЛЕНИЕ

Согласно нашему обсуждению, вам может потребоваться создать новое поле geo_point в вашем сопоставлении, например:

PUT indexname
{
  "mappings": {
    "my_type": {
      "properties": {
        "location": {
          "type": "geo_point"
        },
        "geometry": {
          "type": "geo_shape",
          "tree": "quadtree",
          "precision": "1m"
        }
      }
    }
  }
}

Затем из вашего кода Python вам нужно создать это новое поле, прочитав первую координату из файла JSON, что-то вроде псевдокода ниже:

import json

doc = json.loads(file(jsonfiles).read())
# create the new location field
doc['location'] = doc['geometry']['coordinates'][0][0]
r = requests.post(url_of_index, data=json.dumps(doc)) 
person Val    schedule 15.04.2017
comment
Я могу это сделать, но все равно получаю ту же ошибку Нет совместимых полей: шаблон индекса indexname не содержит ни одного из следующих типов полей: geo_point - person user6754289; 17.04.2017
comment
Возможно, вам стоит обновить свой вопрос и показать выполняемые команды и полученную ошибку. - person Val; 17.04.2017
comment
обновлено - я хочу попробовать что-то визуализировать на расширенной тайловой карте. Но, похоже, geo_shape не поддерживается. Как я могу работать с массивом полигонов как с точкой? - person user6754289; 17.04.2017
comment
Можете ли вы показать команды, которые вы выполняете для индексации документа, и отображаемую ошибку? Также покажите, что вы пытаетесь сделать в Кибане. Я хотел бы понять, почему ES / Kibana жалуется на geo_point. - person Val; 17.04.2017
comment
См. Edit2 выше - person user6754289; 17.04.2017
comment
Также стоит отметить, что агрегаты geo_shape еще не поддерживаются в Kibana: github.com/elastic/kibana/issues / 2576 - person Val; 17.04.2017
comment
Поскольку ваши файлы содержат данные GeoJSON, единственный допустимый тип данных, который вы можете использовать, - это geo_shape, а не geo_point. Но, как было сказано в моем предыдущем комментарии, Kibana еще не поддерживает агрегирование geo_shape. - person Val; 17.04.2017
comment
Хорошо, у меня создалось впечатление, что он поддерживается для Enhanced_tilemap. Есть ли способ использовать один массив координат. Например. Координаты [0] [0] и сделать их точкой, чтобы я мог видеть хотя бы некоторую информацию о временных рядах? (Сообщите мне, если лучше перенести это обсуждение в чат) - person user6754289; 17.04.2017
comment
Действительно, в коде индексации вы можете добавить еще одно поле geo_point в свое сопоставление (как изначально) и при чтении файла GeoJSON инициализировать это новое поле первой координатой массива coordinates. - person Val; 17.04.2017
comment
Эта команда, похоже, не обращается к первому массиву, потому что на карте листов ничего не отображается ... есть идеи? curl -XPUT "http://localhost:9200/indexname" -d "{\"mappings\" : {\"my_type" : {\"properties\" : {\"geometry\" : {\"properties\": {\"coordinates[0][0]\" : {\"type\":\"geo_point\"}}}}}}}" Я немного не понимаю, как создать то, что вы только что сказали. - person user6754289; 17.04.2017
comment
Я не понимаю, как это сделать: инициализировать это новое поле первой координатой массива координат. - person user6754289; 17.04.2017
comment
Вам нужно сделать это из вашего кода Python. Смотрите мой обновленный ответ - person Val; 17.04.2017
comment
Это был псевдокод :-) Я обновил свой ответ, добавив кодировщик / декодер JSON. - person Val; 17.04.2017
comment
ах спасибо !!! Это была самая большая помощь, я боролся с этим в течение недели. - person user6754289; 17.04.2017
comment
Было бы здорово, если бы я мог помочь ;-) - person Val; 17.04.2017