Как мне пройти Elasticsearch Обновление или Вставка, используя Python TypeError? - PullRequest
0 голосов
/ 17 мая 2018

У меня странная проблема.Если я использую curl с полезной нагрузкой, которую я отправляю в Elasticsearch, у меня нет проблем.Когда я пытаюсь передать JSON вastic через веб-сервис с использованием Python, я получаю, в зависимости от того, как я установил полезную нагрузку

  • TypeError: unhashable type: 'dict'
  • asticsearch.exceptions.RequestError: TransportError (400, 'action_request_validation_exception', 'Validation Failed: 1: отсутствует скрипт или документ;')

Чтобы помочь отладить это, я вынул код изапустил его, чтобы попытаться выяснить это.

Чтобы создать запись, я запускаю следующее.

edit_author1 = {"name": "Sheldon Sid", "myid": 18}
resp = es.index(index="radsearch", doc_type="default", id=18, body={"doc": edit_author1})

Это работает для первоначального создания записи при использовании es.create или es.index, и он возвращает следующее, как если бы я использовал curl из терминала.

{
  "_index": "radsearch",
  "_type": "default",
  "_id": "18",
  "_version": 1,
  "found": true,
  "_source": {
    "doc": {
      "name": "Sheldon Sid",
      "myid": 18
    }
  }
}

Он работает как положено.Когда я пытаюсь запустить обновление, где у меня есть следующее

resp = es.update(index="radsearch", doc_type="default", id=18, body={'doc': edit_author1})

Вышеприведенное возвращает

{
  "_index": "radsearch",
  "_type": "default",
  "_id": "18",
  "_version": 2,
  "found": true,
  "_source": {
    "doc": {
      "name": "Sheldon Sid",
      "myid": 18
    **},
    "myid": 18,
    "name": "Sheldon Sid"
  }**
}

Но документ повторяется как отдельная запись в doc.Если я запускаю его с помощью curl, он обновляет документ и не создает вторую запись, как указано выше.

Если я пытаюсь запустить create или update без ключа doc, я получаю TypeError: unhashable type: 'dict '

resp = es.update(index="radsearch", doc_type="default", id=18, body={edit_author1})
TypeError: unhashable type: 'dict'

Если я пытаюсь запустить обновление как

resp = es.update(index="radsearch", doc_type="default", id=18, body=edit_author1)

, я получаю

elasticsearch.exceptions.RequestError: 
TransportError(400, 'action_request_validation_exception', 
                    'Validation Failed: 1: script or doc is missing;')

Любые идеи о том, как это исправить, как яя застрял?

С уважением.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Наконец-то нашел ответ. Это проблема форматирования. Я был близко. Чтобы использовать Elasticsearch API, вам нужно добавить документ, чтобы запустить обновление.

Для начальной вставки это работает

edit_author1 = {"name": "Sheldon Sid", "myid": 18}

Если вы хотите обновить, вам нужно изменить его следующим образом

edit_author1 = {"doc":{"name": "Sheldon Sid2", "myid": 18})

Обратите внимание на документ впереди. Если вы не добавите документ в обновление и попытаетесь выполнить команду

resp = es.update(index="myindex",
                     doc_type="default",
                     id=18,
                     body=edit_author1)

Вы получите ошибку

elasticsearch.exceptions.RequestError: 
TransportError(400, 'action_request_validation_exception', 
                'Validation Failed: 1: script or doc is missing;')
0 голосов
/ 17 мая 2018

В запросе index используется довольно ненужное поле doc, в то время как запрос update работает, как и ожидалось, он обновил _source, а не doc внутри него.

В случае ошибки использованный body недействителен. Используйте

resp = es.update(index="radsearch", doc_type="default", id=18, 
 body={"doc": edit_author1})

См .: пример использования

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