使用NEST批量插入ElasticSearch

时间:2015-06-04 11:12:30

标签: c# elasticsearch nest elasticsearch-net

我尝试向elasticsearch添加100k产品,但当我尝试获取时:{“验证失败:1:未添加任何请求;”}

我的代码:

        var Node = new Uri("......");
        var ConnectionPool = new SniffingConnectionPool(new[] { Node });
        var Config = new ConnectionConfiguration(ConnectionPool)
                    .SniffOnConnectionFault(false)
                    .SniffOnStartup(false)
                    .SniffLifeSpan(TimeSpan.FromMinutes(10));
        var Client = new ElasticsearchClient(Config);

        var AllProducts = Product.GetProducts();
        var SPl = AllProducts.Split(100); // Split into 100 collections/requests

        var COll = new List<ElasticsearchResponse<DynamicDictionary>>();

        foreach (var I in SPl)
        {
            var Descriptor = new BulkDescriptor();

            foreach (var Product in I)
            {
                Descriptor.Index<Product>(op => op.Document(Product));
            }

            COll.Add(Client.Bulk(Descriptor));
        }

AllProducts包含此对象的列表:

public class Product
{
 public int AffiliateNr { get; set; }
 public string AffiliateProductId { get; set; }
 public int BrandNr { get; set; }
 public string Currency { get; set; }
 public string IndexId { get; set; }
 public decimal Price { get; set; }
 public long ProductNr { get; set; }
 public string Title { get; set; }
}

所以,

  1. 我在哪里可以设置索引的名称?
  2. 为什么我得到,验证失败:1:没有添加请求;?
  3. IndexId是我对该产品的ID。我如何告诉Elasticsearch使用此ID?或者我必须指定一个ID吗?

1 个答案:

答案 0 :(得分:6)

参考上一个问题,您可以使用IndexMany索引数据。 现在根据您在评论中的问题,您可以指定弹性搜索将使用的ID。见下面的例子。

  ElasticType(IdProperty = "<fieldName>")]
    public class ClassName
    {

如果您不想指定任何Id到弹性搜索,请创建一个虚拟字段dummyId(可空)并将其放入“IdProperty”。如果弹性搜索为空,则弹性搜索将自动为其分配值。

编辑: 从2.3开始,它的

[ElasticsearchType(IdProperty = "<fieldName>")]