2016-07-07 10 views
0

Ich möchte einen binären Parameter in meinem Elasticsearch-Server von meinem C# -Code gespeichert haben. Keiner der Typen, die ich in meiner Indexklasse zu verwenden versuchte, übersetzt dies.Verwenden von binären Typ mit NEST (elasticsearch)

Gibt es eine Möglichkeit, mein Programm explizit anzuweisen, eine Binärdatei zu speichern, sagen wir aus einem Byte-Array (könnte in andere Arten von Kurs umgewandelt werden)?

Gibt es alternativ eine Möglichkeit, den Parameter so zu konfigurieren, dass er nicht gespeichert wird (wie bei der Json-Eigenschaft "stored": false)? Da das Hauptproblem für mich das Kopieren und Indizierung von diesem großen Parameter ist (nicht ideal, aber ausreichend)

Update: Ich habe versucht, meine NEST Version 1.6.1 degradieren das

[ElasticProperty(Name = "Data", Type = FieldType.Binary, Store = false)] 
public byte[] Data { get; set; } 

Attribut zu verwenden, aber wenn ich ein Dokument mit dieser Eigenschaft zu speichern, besteht darauf, es noch eine Zeichenfolge zur Karte (I überprüfen, indem GET mydb/_mapping in meiner Sense-Plugin läuft)

Antwort

4

Elasticsearch supports binary types die Attribute innerhalb NESTS mit dem folgend in NEST 1.x eingestellt werden kann mit

public class Document 
{ 
    [ElasticProperty(Type = FieldType.Binary, Store = false)] 
    public string Binary { get; set; } 
} 

oder

public class Document 
{ 
    [Binary(Store= false)] 
    public string Binary { get; set; } 
} 

in NEST 2.x

beachten, dass der binäre Typ sollte als eine Basis 64 codierte Zeichenfolge (1.x docs oder 2.x docs) zu Elasticsearch gesendet werden. Sie könnten die Umwandlung in Ihrem POCO-Typ mit so etwas wie (für 2.x)

public class Document 
{ 
    [JsonIgnore] 
    public byte[] BinaryBytes { get; set;} 

    [Binary] 
    [JsonProperty("binary")] 
    public string Binary 
    { 
     get 
     { 
      return BinaryBytes != null ? Convert.ToBase64String(BinaryBytes) : null; 
     } 
     protected set 
     { 
      if (value != null) BinaryBytes = Convert.FromBase64String(value); 
     } 
    } 
} 

client.CreateIndex("index-name", c => c 
    .Mappings(m => m 
     .Map<Document>(d => d 
      .AutoMap() 
     ) 
    ) 
); 

handhaben, die

{ 
    "mappings": { 
    "document": { 
     "properties": { 
     "binary": { 
      "type": "binary" 
     } 
     } 
    } 
    } 
} 

Dann liefert Ihnen BinaryBytes auf das Modell gesetzt würde, und NEST würde den Inhalt senden Binary in der Anfrage. Sie könnten auch Binary zu einer privaten Eigenschaft machen, wenn dies für die Benutzer des Modells weniger verwirrend wäre.

+0

Vielen Dank für Ihre Hilfe, es scheint, dass nur das Hinzufügen des 'client.CreateIndex' Teils statt NEST es selbst zu tun gab mir, was ich wollte –

+0

@OdedSayar gibt es zwei Dinge, die Elasticsearch hilft beim Aufstehen und läuft; Erstellen Sie zuerst automatisch einen Index, falls dieser noch nicht existiert. Dieses Verhalten kann mit - https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-creation gesteuert werden. Zweitens, die Felder eines Dokuments dynamisch zuordnen (d. H. Die Datentypen ableiten), wenn für den Dokumenttyp keine explizite Zuordnung angegeben ist. Dies kann auch kontrolliert werden - https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html –