2015-06-04 17 views
6

tôi cố gắng thêm 100k sản phẩm để elasticsearch, nhưng khi tôi cố gắng tôi nhận được: { "Validation Không: 1: không có yêu cầu bổ sung;"}chèn hàng loạt để ElasticSearch với NEST

Mã của tôi:

 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 chứa một danh sách các đối tượng này:

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; } 
} 

Vì vậy,

  1. Tôi có thể đặt tên chỉ mục ở đâu?
  2. Tại sao tôi nhận được, Xác thực không thành công: 1: không có yêu cầu nào được thêm ;?
  3. IndexId là id của tôi cho sản phẩm. Làm cách nào để tôi yêu cầu Elasticsearch sử dụng id này? Hoặc tôi phải chỉ định một id?
+0

tại sao không sử dụng IndexMany? –

+1

thanx. Tôi hiện có: SPl.Select (I => Client.IndexMany (I, "products")) Và nó hoạt động. Nhưng: IndexId là id của tôi cho sản phẩm. Làm cách nào để tôi yêu cầu Elasticsearch sử dụng id này? Hoặc tôi phải chỉ định một id? – mrcode

+0

Đổi tên trường IndexId thành Id và elasticsearch sẽ sử dụng trường này theo quy ước làm id của tài liệu. – Manolis

Trả lời

5

Tham chiếu đến sự cố trước đó của bạn, bạn có thể sử dụng IndexMany để lập chỉ mục dữ liệu. Bây giờ theo câu hỏi của bạn trong nhận xét, bạn có thể chỉ định id mà tìm kiếm đàn hồi sẽ sử dụng. xem ví dụ dưới đây.

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

nếu bạn không muốn chỉ định bất kỳ Id nào cho tìm kiếm đàn hồi, hãy tạo trường giả dummyId (không thể nhập) và đặt nó trong "IdProperty". Tìm kiếm đàn hồi sẽ tự động gán giá trị cho nó nếu nó rỗng.

Edit: Từ 2.3 trở đi, nó

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

Hoàn hảo. Có cách nào dễ dàng để đánh dấu các thuộc tính mà tôi không muốn lập chỉ mục trong elasticsearch? :) – mrcode

+1

@mrcode: có, vui lòng xem câu trả lời http://stackoverflow.com/questions/23063839/c-sharp-nest-elasticsearch-exclude-object-property-from-being-indexed. đánh dấu câu trả lời ở trên nếu câu trả lời đúng –

Các vấn đề liên quan