2014-10-17 117 views
2

我是Elasticsearch中的新成員。 我需要使用NEST API使用批量選項插入文檔。我如何使用NEST Bulk Api將文檔添加到elasticsearch中

我必須從表中索引5000個文檔。以下是我用於批量索引的代碼。

public ActionResult CreateBulk() 
     {    

      var descriptor = new BulkDescriptor();   

      foreach (var test in db.Attendance.Take(5000).ToList()) 
      { 
       descriptor.Index<Attendance>(op => op.Document(new Attendance 
       { 
        AttendanceId = test.AttendanceId, 
        AttendanceDate = test.AttendanceDate, 
        Estate = test.Estate, 
        Division = test.Division, 
        FieldNo = test.FieldNo, 
        Employee = test.Employee, 
        Activity = test.Activity, 
        Quantity = test.Quantity 
       }));     
      } 
      var bulkresult = ElasticClient.Bulk(descriptor); 
      return RedirectToAction("Index"); 
     } 

但是,當我運行的代碼,我收到以下錯誤:

System.NullReferenceException was unhandled by user code 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=Nest 
    StackTrace: 
     at Nest.NestSerializer.SerializeBulkDescriptor(IBulkRequest bulkRequest) in c:\Users\gmarz\code\elasticsearch-net\src\Nest\ExposedInternals\NestSerializer.cs:line 166 
     at Nest.ElasticClient.<Bulk>b__1b6(ElasticsearchPathInfo`1 p, BulkDescriptor d) in c:\Users\gmarz\code\elasticsearch-net\src\Nest\ElasticClient-Bulk.cs:line 31 
     at Nest.ElasticClient.Dispatch[D,Q,R](D descriptor, Func`3 dispatch) in c:\Users\gmarz\code\elasticsearch-net\src\Nest\ElasticClient.cs:line 82 
     at Nest.ElasticClient.Dispatch[D,Q,R](Func`2 selector, Func`3 dispatch) in c:\Users\gmarz\code\elasticsearch-net\src\Nest\ElasticClient.cs:line 70 
     at Nest.ElasticClient.Bulk(Func`2 bulkSelector) in c:\Users\gmarz\code\elasticsearch-net\src\Nest\ElasticClient-Bulk.cs:line 27 
     at AttendancePOC.Controllers.AttendanceController.CreateBulk() in D:\GIT Source\ElasticSearch\AttendancePOC\AttendancePOC\Controllers\AttendanceController.cs:line 114 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() 
     at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
     at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() 
     at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    InnerException: 

請幫助我..有什麼不對我的代碼?

+0

記住你的ConnectionSettings?你在做任何類型的自定義序列化?另外,您使用的ES和NEST版本是什麼? – 2014-10-21 01:52:02

+0

@Greg我正在使用ES版本1.3.2和NEST veraion 1.1.1。 – 2014-10-21 05:55:29

+0

Greg Marzouka我的連接字符串是: 2014-10-21 05:58:23

回答

2

我有同樣的確切問題。 我忘了設置此查詢的索引名稱。 我已經設置了一個配置,它在創建新ElasticClient期間設置了默認索引,但配置發生了變化,我的索引爲空。

希望幫助

0

我有這個問題,該解決方案是包含在ConnectionSettingsdefaultIndex財產陳述here如:

var node = new Uri("http://something:9200"); 
var settings = new ConnectionSettings(node, "someDefaultIndexValue"); 
var client = new ElasticClient(settings); 
0

我做這樣的事情:

 var node = new Uri(elasticSearchURI); 
     var connectionPool = new SniffingConnectionPool(new[] { node }); 
     var config = new ConnectionSettings(connectionPool) 
           .SniffOnConnectionFault(false) 
           .SniffOnStartup(false) 
           .SetTimeout(600000) 
           .DisablePing(); 
     var EsClient = new ElasticClient(config); 

然後我創建索引,然後我使用這樣的東西:

 List<Categories> categList = new List<Categories>(); 

     if (categoriesData != null) 
     { 
      Parallel.ForEach(categoriesData, element => 
      { 
       Categories inf = new Categories(); 

       inf.Code = element.Code; 
       inf.Level = element.Level; 

       lock(categList) 
       { 
        categList.Add(inf); 
       } 

      }); 

      EsClient.IndexMany<Categories>(categList,"index_name","type_name") 
     } 
相關問題