2015-06-04 18 views
6

cerco di aggiungere 100k prodotti elasticsearch, ma quando provo ottengo: { "Convalida non riuscita: 1: nessuna richiesta aggiunto;"}inserimento di massa per elasticsearch con NEST

Il mio codice:

 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 contiene un elenco di questo oggetto:

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

Quindi,

  1. Dove posso impostare il nome dell'indice?
  2. Perché ho ricevuto, Convalida non riuscita: 1: nessuna richiesta aggiunta?
  3. IndexId è il mio ID per il prodotto. Come faccio a dire a Elasticsearch di usare questo ID? O devo specificare un ID?
+0

perché non usare IndexMany? –

+1

grazie. Ora ho: SPl.Seleziona (I => Client.IndexMany (I, "prodotti")) E funziona. Ma: IndexId è il mio ID per il prodotto. Come faccio a dire a Elasticsearch di usare questo ID? O devo specificare un ID? – mrcode

+0

Rinominare il campo IndexId su Id e elasticsearch userà questo per convenzione come id del documento. – Manolis

risposta

5

In riferimento al problema precedente, è possibile utilizzare IndexMany per l'indicizzazione dei dati. Ora come da tua domanda nel commento, puoi specificare l'id che la ricerca elastica utilizzerà. vedere l'esempio di seguito.

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

se non volete specificare qualsiasi Id al elasticsearch, creare un campo fittizio dummyId (nullable) e metterlo in "IdProperty". La ricerca elastica assegnerà automaticamente il valore ad esso se è nullo.

Edit: da 2,3 in poi, la sua

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

Perfetto. C'è un modo semplice per contrassegnare le proprietà che non desidero indicizzare in elasticsearch? :) – mrcode

+1

@mrcode: sì, passare alla risposta http://stackoverflow.com/questions/23063839/c-sharp-nest-elasticsearch-exclude-object-property-from-being-indexed. segna la risposta sopra se è corretta –