2017-07-01 1 views
0

Nous devons créer des facettes dans un champ qui est un tableau de int [1,2,3,4,5,6]. Si nous mappons ce champ en tant que Texte, Elasticsearch lève une exception. Si nous le marquons comme mot-clé, nous n'obtenons pas tous les éléments individuels dans la facette.Bibliothèque Elasticsearch NEST

Comment cela peut-il être réalisé avec la bibliothèque NEST (version 5)

Un grand merci

Répondre

1

Plan comme un entier. NEST's automapping déduira un mappage entier pour par défaut

Compte tenu du type suivant

public class Message 
{ 
    public int[] Integers { get; set; } 
} 

AutoMapping ressemblerait

var client = new ElasticClient(); 

client.CreateIndex("messages", c => c 
    .Mappings(m => m 
     .Map<Message>(mm => mm 
      .AutoMap() 
     ) 
    ) 
); 

qui produit le mappage suivant

{ 
    "mappings": { 
    "message": { 
     "properties": { 
     "integers": { 
      "type": "integer" 
     } 
     } 
    } 
    } 
} 

Vous pouvez utilisez attribute mapping si vous voulez co explicitement ntrol la cartographie

public class Message 
{ 
    [Number(NumberType.Integer)] 
    public int[] Integers { get; set; } 
} 
var client = new ElasticClient(); 

client.CreateIndex("messages", c => c 
    .Mappings(m => m 
     .Map<Message>(mm => mm 
      .AutoMap() 
     ) 
    ) 
); 

Ou fluent mapping si vous préférez garder la cartographie séparé de votre Poços

client.CreateIndex(messagesIndex, c => c 
    .Mappings(m => m 
     .Map<Message>(mm => mm 
      .AutoMap() 
      .Properties(p => p 
       .Number(n => n 
        .Name(nn => nn.Integers) 
        .Type(NumberType.Integer) 
       )   
      ) 
     ) 
    ) 
); 

ou en utilisant le scalar method

client.CreateIndex(messagesIndex, c => c 
    .Mappings(m => m 
     .Map<Message>(mm => mm 
      .AutoMap() 
      .Properties(p => p 
       .Scalar(n => n.Integers)    
      ) 
     ) 
    ) 
); 

Avec la cartographie en place, facettage sur des valeurs entières ressemblerait à

client.IndexMany(new[] { 
    new Message { Integers = new [] { 1, 2, 3 } }, 
    new Message { Integers = new [] { 3, 4, 5 } }, 
    new Message { Integers = new [] { 1, 4, 5 } }, 
}); 

client.Refresh(messagesIndex); 

var searchResponse = client.Search<Message>(s => s 
    .Size(0) 
    .Aggregations(a => a 
     .Terms("ints", t => t 
      .Field(f => f.Integers) 
     ) 
    ) 
); 

foreach (var bucket in searchResponse.Aggs.Terms<int>("ints").Buckets) 
{ 
    Console.WriteLine($"{bucket.Key}:{bucket.DocCount}"); 
} 

qui donne

1:2 
3:2 
4:2 
5:2 
2:1