【问题标题】:How do i add documents to elasticsearch using NEST Bulk Api如何使用 NEST Bulk Api 将文档添加到 elasticsearch
【发布时间】:2014-10-17 13:33:29
【问题描述】:

我是 Elasticsearch 的新手。 我需要使用 NEST api 使用批量选项插入文档。

我必须从一个表中索引 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:

请帮帮我。我的代码有什么问题吗?

【问题讨论】:

  • 介意发布您的 ConnectionSettings 吗?你在做任何类型的自定义序列化吗?另外,您使用的是什么版本的 ES 和 NEST?
  • @Greg 我使用的是 ES 版本 1.3.2 和 NEST 版本 1.1.1。
  • Greg Marzouka 我的连接字符串是:
  • 我不是指你的 SQL 连接字符串,我指的是你传递给 ElasticClient 实例的 ConnectionSettings 类。您是否更改了任何序列化设置?
  • @Greg Marzouka...不,我没有更改任何设置。私有静态 ElasticClient ElasticClient { get { var setting = new ConnectionSettings(new Uri("localhost:9200")); return new ElasticClient(setting); } }

标签: elasticsearch nest


【解决方案1】:

我遇到了同样的问题。 我忘了为此查询设置索引名称。 我设置了一个配置,该配置在创建新 ElasticClient 期间设置了默认索引,但配置发生了变化,我的索引为空。

希望有帮助

【讨论】:

    【解决方案2】:

    请像这样添加默认索引 connectionSettings = new ConnectionSettings(connectionPool).DefaultIndex("indexname")

    【讨论】:

      【解决方案3】:

      我做这样的事情:

              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")
              }
      

      【讨论】:

        【解决方案4】:

        我遇到了这个问题,解决方案是在ConnectionSettings 中包含defaultIndex 属性,如here 所述,例如:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          • 2013-07-22
          • 1970-01-01
          • 2015-11-17
          • 2020-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多