使用 NEST 批量插入 ElasticSearch
Bulk insert to ElasticSearch with NEST
我尝试将 10 万个产品添加到 elasticsearch,但是当我尝试时我得到:{"Validation Failed: 1: no requests added;"}
我的代码:
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:没有添加请求;?
- IndexId 是我的产品 ID。我如何告诉 Elasticsearch 使用这个 id?或者我必须指定一个 ID?
参考你之前的问题,你可以使用IndexMany来索引数据。
现在根据您在评论中的问题,您可以指定弹性搜索将使用的 ID。看下面的例子。
ElasticType(IdProperty = "<fieldName>")]
public class ClassName
{
如果您不想为弹性搜索指定任何 Id,请创建一个虚拟字段 dummyId(nullable) 并将其放入 "IdProperty"。如果为空,Elasticsearch 将自动为其分配值。
编辑:
从 2.3 开始,它
[ElasticsearchType(IdProperty = "<fieldName>")]
我尝试将 10 万个产品添加到 elasticsearch,但是当我尝试时我得到:{"Validation Failed: 1: no requests added;"}
我的代码:
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:没有添加请求;?
- IndexId 是我的产品 ID。我如何告诉 Elasticsearch 使用这个 id?或者我必须指定一个 ID?
参考你之前的问题,你可以使用IndexMany来索引数据。 现在根据您在评论中的问题,您可以指定弹性搜索将使用的 ID。看下面的例子。
ElasticType(IdProperty = "<fieldName>")]
public class ClassName
{
如果您不想为弹性搜索指定任何 Id,请创建一个虚拟字段 dummyId(nullable) 并将其放入 "IdProperty"。如果为空,Elasticsearch 将自动为其分配值。
编辑: 从 2.3 开始,它
[ElasticsearchType(IdProperty = "<fieldName>")]