2016-01-12 3 views
1

Я использую версию 2.1 и 2.0 (альфа) клиент с клиентом Nest C# ... Я пытаюсь навалом вставить некоторые записи, однако сервер возвращает ошибку. Я использую клиента на клиенте Windows, говорящем на сервере Linux (я не думаю, что это должно иметь значение, однако).ElasticSearch Bulk Indexing

public static void AddQuestionsToElasticSearch() 
    { 
     var es = new ElasticsearchClient(new ConnectionConfiguration(
      new Uri("http://elasticserver:9200")) 
     ); 

     var foobars = new FooBar().Parse(); 
     var descriptor = new BulkDescriptor(); 

     descriptor.CreateMany<FooBar>(foobars, (bd, q) => bd.Id(q.Id.ToString()).Index("foobars")); 

     Console.WriteLine($"Inserting foobars into ES..."); 
     var sw = new Stopwatch(); 
     sw.Start(); 

     var result = es.Bulk<FooBar>(descriptor); 

     sw.Stop(); 
     Console.WriteLine($"Finished inserting foobars {GetTimeTaken(sw.Elapsed)}"); 
    } 

Update - Error Info

Ошибка я получаю в ответ возвращается из метода Bulk() ... два свойства на BulkResponse возвращаемые:

OriginalException: "удаленный сервер возвратил ошибку: (400) Bad Request"

ServerError.Error: "не удалось выполнить проверку: 1: никаких запросов не было добавлено"

+0

Какая ошибка? –

+0

обновленный вопрос с ошибками – bbqchickenrobot

+0

Вы уверены, что 'new FooBar(). Parse();' возвращает на самом деле какие-либо предметы? – Rob

ответ

2

Вы сделали простую ошибку: вы используете низкий уровень ElasticsearchClient от Elasticsearch.Net, чтобы сделать запрос, но отправив ему строго типизированный запрос массы из NEST. Чтобы исправить это достаточно просто, нужно просто использовать ElasticClient из НЕСТА

public static void AddQuestionsToElasticSearch() 
{ 
    var es = new ElasticClient(new Uri("http://elasticserver:9200")); 

    var foobars = new FooBar().Parse(); 
    var descriptor = new BulkDescriptor(); 

    descriptor.CreateMany<FooBar>(foobars, (bd, q) => bd.Id(q.Id.ToString()).Index("foobars")); 

    Console.WriteLine($"Inserting foobars into ES..."); 
    var sw = new Stopwatch(); 
    sw.Start(); 

    var result = es.Bulk(descriptor); 

    sw.Stop(); 
    Console.WriteLine($"Finished inserting foobars {GetTimeTaken(sw.Elapsed)}"); 
} 

ElasticClient из НЕСТА является клиентом высокого уровня и использует ElasticsearchClient из Elasticsearch.Net под одеялом.

+0

Спасибо @ Russ - Попробуй это сейчас. Я просто знаком с ES, поэтому простите меня, но у меня есть еще один второстепенный вопрос: следует ли использовать CreateMany <>() или IndexMany()? Не удалось определить diff из документов (возможно, пропустил somen). – bbqchickenrobot

+2

'CreateMany()' не удастся для любого индивидуального вызова создания, где документ уже существует в индексе с тем же типом и 'Id', тогда как' IndexMany 'будет вставлять документ или перезаписывать существующий документ того же типа и 'Id' (если вы не указали тип, это будет выведено из T). По сути, 'CreateMany ' полезен в ситуациях, когда вы хотите использовать Оптимистический контроль параллелизма. См. Https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html. –

Смежные вопросы