выгрузить объемные данные в упругий поиск с помощью Python API - PullRequest
0 голосов
/ 16 марта 2019

Я хочу проиндексировать данные Шекспира в упругом поиске, используя его Python API.Я получаю сообщение об ошибке ниже.

    PUT http://localhost:9200/shakes/play/3 [status:400 request:0.098s]
{'error': {'root_cause': [{'type': 'mapper_parsing_exception', 'reason': 'failed to parse'}], 'type': 'mapper_parsing_exception', 'reason': 'failed to parse', 'caused_by': {'type': 'not_x_content_exception', 'reason': 'Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes'}}, 'status': 400}

Python-скрипт

from elasticsearch import Elasticsearch
from elasticsearch import TransportError
import json

data = []

for line in open('shakespeare.json', 'r'):
    data.append(json.loads(line))

es = Elasticsearch()

res = 0
cl = []
# filtering data which i need
for d in data:
    if res == 0:
        res = 1 
        continue
    cl.append(data[res])
    res = 0

try:
    res = es.index(index = "shakes", doc_type = "play", id = 3, body = cl)
    print(res)
except TransportError as e:
    print(e.info)

Я также пытался использовать json.dumps, но все равно получаю ту же ошибку.Но когда добавляется только один элемент списка к упругому поиску ниже, код работает.

1 Ответ

1 голос
/ 16 марта 2019

Вы не отправляете массовый запрос на es, а только простой запрос на создание - пожалуйста, посмотрите здесь .Этот метод работает с dict, который представляет новый документ, а не со списком документов.Если вы указали идентификатор в запросе на создание, вам нужно сделать это значение динамическим, в противном случае каждый документ будет перезаписан идентификатором последнего указанного документа.Если в вашем json есть запись для каждой строки, вы должны попробовать это -Пожалуйста, прочитайте здесь для массовой документации:

  from elasticsearch import helpers

es = Elasticsearch()
op_list = []
with open("C:\ElasticSearch\shakespeare.json") as json_file:
    for record in json_file:
        op_list.append({
                       '_op_type': 'index',
                       '_index': 'shakes',
                       '_type': 'play',
                       '_source': record
                     })
helpers.bulk(client=es, actions=op_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...