Как массово вставить Json с помощью эластичного поиска NEST?

Я пытаюсь вставить несколько записей в свою базу данных с помощью Nest. Вставка с использованием класса IndexMany работает, однако мне также нужно вставлять объекты по строке json.

Я посмотрел на github и нашел несколько примеров использования RAWclient. Ниже примера кода я вставляю свой файл json.

    > var twitter = _jsonData;          
    > var result = client.Raw.BulkPost(
    >               new { twitter }
    >               , qs => qs
    >                   //.Replication(ReplicationOptions.Async)
    >                   .Refresh(true)          );

некоторая дополнительная информация:

jsondata:

tweet tweet1 = new tweet { id = "104", name = "test104", lastname = "test107" }; //ect....
List<tweet> data; //multiple tweet objects are added
string json = Newtonsoft.Json.JsonConvert.SerializeObject(data);

вар твиттер:

{
      "twitter": "[{'name':'test104','lastname':'test107','id':'104'},{'name':'test105','lastname':'test108','id':'105'},{'name':'test106','lastname':'test109','id':'106'}]"
}

результат, который я получаю из базы данных:

{"error":"Unexpected end-of-input: expected close marker for OBJECT (from [Source: [B@10893e4; line: 1, column: 0])\n at [Source: [B@10893e4; line: 2, column: 3]"}

Кто-нибудь знает, в чем может быть проблема? или что мне не хватает в моем json/коде?


person Greezer    schedule 25.02.2014    source источник


Ответы (1)


Ваш json не подходит для массовой операции elasticsearch. См. документацию.

В массовом запросе каждому объекту данных должна предшествовать команда, потому что один массовый запрос может содержать вставки, обновления или удаления, а не только вставки. Итак, ваш json должен выглядеть так

  { "index" : { "_index" : "twitter", "_type" : "tweets" } }\n
  {'name':'test104','lastname':'test107','id':'104'}\n
  { "index" : { "_index" : "twitter", "_type" : "tweets" } }\n
  {'name':'test105','lastname':'test108','id':'105'}\n
  { "index" : { "_index" : "twitter", "_type" : "tweets" } }\n
  {'name':'test106','lastname':'test109','id':'106'}\n

Чтобы уменьшить нагрузку на повторяющиеся команды, вы можете переместить некоторые аргументы в uri запроса. Тогда json может быть короче:

  { "index" : { } }\n
  {'name':'test104','lastname':'test107','id':'104'}\n

В IRawElasticClient это означает перемещение их в аргументы BulkPost.

  var result = client.Raw.BulkPost(new { twitter }, "twitter", "tweets");
person v.shashenko    schedule 25.02.2014
comment
спасибо, ваше последнее редактирование сработало. Кажется, я пропустил документ по формату json для наращивания. - person Greezer; 25.02.2014
comment
Кажется, что в массе много накладных расходов, есть ли другой способ набрать массу? например, только с 1 оператором данные в любом случае будут в том же формате. - person Greezer; 25.02.2014
comment
Я не думаю, что есть другой способ набрать массу. Но можно использовать более короткие команды. Смотрите редактирование. - person v.shashenko; 25.02.2014
comment
Я изменил его на: var result = client.Raw.BulkPost(twitter, tweets, _jsonData, qs => qs.Refresh(true)); и это, кажется, работает хорошо, спасибо - person Greezer; 26.02.2014
comment
Теперь, год спустя, кажется, что client.Raw.BulkPost() недоступен в NEST. Как можно сделать массовый вызов с текущей версией? - person Calle; 20.03.2015
comment
Теперь это client.LowLevel.Bulk(). - person Paul Lambert; 19.04.2016