Почтовый запрос для массового API дает код состояния 406. Как его решить?

Я использую Elastic search 6.1 version Мои данные добавляются правильно, и я добавляю '\n' в конце запроса.

Мой код выглядит следующим образом:

def insert_in_bulk(self, filee, rtype):
    U = urljoin(self.args.host, "/_bulk")
    body = []
    f = open(filee)
    for line in f:
        action = {
                'index' :{
                '_index' : self.args.index,
                '_type' : rtype,
                  }
                }
        item = {
            'word' : line.strip()
            }

        body.append(json.dumps(action))
        body.append(json.dumps(item))

    f.close()

    body = '\n'.join(body)+'\n'
    success = False
    try:
        r = requests.post(U, data=body)
        self.log.info("after request")
        if r.status_code == 200:
            success = True
        r = r.json()
        self.log.info("inserted %s items of type = %s", self.args.index , rtype)
    except (SystemExit, KeyboardInterrupt): raise
    except:
          self.log.exception("during bulk index")

    if not success:
             self.log.error("failed to index records of type = %s", rtype)

Я использую питона для подключения к упругому поиску.

Я получил ответ по этой ссылке Массовый индексный документ из файла JSON в ElasticSearch

Я должен передать заголовок запроса как application/x-ndjson.

1 ответ

Хотя вопрос уже давно задан, но я хочу дать решение, которое сработало для меня в большинстве случаев,

def insert_in_bulk(self, filee, rtype):
    U = urljoin(self.args.host, "/_bulk")
    body = []
    f = open(filee)
    for line in f:
        action = {
                'index' :{
                '_index' : self.args.index,
                '_type' : rtype,
                  }
                }
        item = {
            'word' : line.strip()
            }

        body.append(json.dumps(action))
        body.append(json.dumps(item))

    f.close()


    payload = ""
    for l in body:
        payload = payload + f"{l} \n"
    data = payload.encode('utf-8')

    r = requests.post(U, data=data, headers={"Content-Type": "application/x-ndjson"})
    print(r.text)
Другие вопросы по тегам