Индексирование фрейма данных вasticsearch с использованием Python - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь проиндексировать некоторые данные панд в ElasticSearch.У меня есть некоторые проблемы при разборе JSON, который я генерирую.Я думаю, что моя проблема исходит от картирования.Пожалуйста, найдите мой код ниже.

import logging
from pprint import pprint
from elasticsearch import Elasticsearch
import pandas as pd

def create_index(es_object, index_name):
    created = False
    # index settings
    settings = {
        "settings": {
            "number_of_shards": 1,
            "number_of_replicas": 0
        },
        "mappings": {
            "danger": {
                "dynamic": "strict",
                "properties": {
                    "name": {
                       "type": "text"
                    },
                    "first_name": {
                        "type": "text"
                    },
                    "age": {
                        "type": "integer"
                    },
                    "city": {
                        "type": "text"
                    },
                    "sex": {
                        "type": "text",
                    },
                }
            }
        }
    }

    try:
        if not es_object.indices.exists(index_name):
            #Ignore 400means to ignore "Index Already Exist" error
            es_object.indices.create(index=index_name, ignore=400,     
body=settings)
            print('Created Index')
        created = True
    except Exception as ex:
        print(str(ex))
    finally:
        return created


def store_record(elastic_object, index_name, record):
    is_stored = True
    try:
        outcome = elastic_object.index(index=index_name,doc_type='danger', body=record)
        print(outcome)
    except Exception as ex:
        print('Error in indexing data')


data = [['Hook', 'James','90', 'Austin','M'],['Sparrow','Jack','15', 'Paris', 'M'],['Kent','Clark','13', 'NYC', 'M'],['Montana','Hannah','28','Las Vegas', 'F'] ]
df = pd.DataFrame(data,columns=['name', 'first_name', 'age', 'city', 'sex'])
result = df.to_json(orient='records')
result = result[1:-1]
es = Elasticsearch()
if es is not None:
        if create_index(es, 'cracra'):
            out = store_record(es, 'cracra', result)
            print('Data indexed successfully')

Я получил следующую ошибку

POST http://localhost:9200/cracra/danger [status:400 request:0.016s]

Error in indexing data
RequestError(400, 'mapper_parsing_exception', 'failed to parse')
Data indexed successfully

Я не знаю, откуда она.Если кто-нибудь может помочь мне решить эту проблему, я был бы признателен.

Большое спасибо!

1 Ответ

0 голосов
/ 03 декабря 2018

Попробуйте удалить лишние запятые из ваших сопоставлений:

"mappings": {
  "danger": {
    "dynamic": "strict",
    "properties": {
      "name": {
        "type": "text"
      },
      first_name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "city": {
        "type": "text"
      },
      "sex": {
        "type": "text", <-- here
      }, <-- and here
    }
  }
}

ОБНОВЛЕНИЕ

Кажется, что индекс создан успешно, и проблема заключается в индексации данных.Как заметил Нишант Сайни , вы, вероятно, пытаетесь проиндексировать сразу несколько документов.Это можно сделать с помощью Bulk API .Вот пример правильного запроса, который индексирует два документа:

POST cracra/danger/_bulk
{"index": {"_id": 1}}
{"name": "Hook", "first_name": "James", "age": "90", "city": "Austin", "sex": "M"}
{"index": {"_id": 2}}
{"name": "Sparrow", "first_name": "Jack", "age": "15", "city": "Paris", "sex": "M"}

Каждый документ в теле запроса должен появляться в новой строке с некоторой мета-информацией перед ним.В этом случае metainfo содержит только идентификатор, который должен быть назначен документу.

Вы можете сделать этот запрос вручную или использовать Elasticsearch Helpers для Python, который может позаботиться о добавлении правильного metainfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...