2016-08-10 17 views
1

Wie in der Abbildung gezeigt habe ich ein Gruppenfeld mit einem Array von String-Werten. Allerdings bekomme ich eine Ausnahme beim Versuch, es auf eine List<string> Eigenschaft abzubilden.Zuordnung eines Array-Feldes zu einer C# -Stringliste mit Elasticsearch

So etwas wie Error converting value \"[134706634,134706635]\" to type System.Collections.Generic.IList[System.String]'

Ich habe versucht, einige verschiedene Attribute mit, dass Elasticsearch bietet aber keine gearbeitet. Ein JSON-Converter-Attribut funktioniert gut, muss aber viel Code schreiben, damit es so funktioniert, wie ich es möchte.

Gibt es eine sauberere und nativere Methode, dies mit NEST zu tun?

C# Code:

var groupQuery = await 
    elastic.SearchAsync<CorrelationGroup>(s => s 
      .Query(q => q 
      .Bool(b => b 
      .Must(
        m => m.ConstantScore(c => c 
         .Filter(f => f 
         .Term(x => x.Type, counterType)) 
        ), 
        m => m.ConstantScore(c => c. 
         Filter(f => f 
         .Term(x => x.TypeValue, counterTypeValue)))))) 
      .Index("correlation-groups").AllTypes()); 

public class CorrelationGroup 
{ 
    [Text(Name = "type")] 
    public string Type { get; set; } 

    [Text(Name = "type_value")] 
    public string TypeValue { get; set; } 

    public List<string> Groups { get; set; } 
} 

Quelle JSON-Datei:

[ { "type": "APN", "type_value": "internet", "groups": [150994936,150994940] }, { "type": "APN", "type_value": "internet", "groups": [150984921,150984922] }, { "type": "APN", "type_value": "internet", "groups": [150984917,150984918,150984921,150984922] } ]

Meine Vorlage ist:

{ 
    "template": "correlation-groups", 
    "settings" : { 
     "number_of_shards" : 2, 
     "number_of_replicas" : 0, 
     "index" : { 
      "store" : { "compress" : { "stored" : true, "tv": true } } 
     } 
    }, 
    "dynamic_templates": [ 
    { 
     "string_template" : { 
      "match" : "*", 
      "mapping": { "type": "string", "index": "not_analyzed" }, 
      "match_mapping_type" : "string" 
     } 
    } 
    ], 
    "mappings": { 
     "_default_": { 
      "properties": { 
       "type": { "type": "string", "index": "not_analyzed" }, 
       "type_value": { "type": "string", "index": "not_analyzed" }, 
       "groups": { "type": "string"} 
      } 
     } 
    } 
} 

LOGSTASH CONF

INDEX

+0

Es scheint, dass Ihr Array tatsächlich eine Zeichenfolge ist. Sieh die entflochtenen doppelten Anführungszeichen um das Array "\" [134706634,134706635] \ "'? Es ist sehr wahrscheinlich, dass Ihr 'groups' Array zu irgendeinem Zeitpunkt mit einem String versehen und als String gespeichert wurde. – Val

+0

Wäre toll zu sehen, wie Sie Mapping für den Index erstellen und wie Sie Daten indexieren. – Rob

+0

@Val Ich habe in der Vorlage den Typ string angegeben (das ist, was ich von Docs verstanden habe) sollte ich stattdessen etwas anderes verwenden? – Cemre

Antwort

1

Das Problem hängt mit Ihrer Vorlage zusammen; Innerhalb der __default__ Zuordnung, da Sie groups als string angegeben haben, wird die eingehende Eigenschaft mit der Zeichenfolge und in Elasticsearch als Zeichenfolge beibehalten. Der Logstash-Codec sendet die groups-Eigenschaft korrekt aus Ihrem Quell-JSON als Nummernfeld, wird jedoch aufgrund der Standardzuordnung, die Sie haben, als Zeichenfolge beibehalten.

zu korrigieren, die __default__ Mapping

"mappings": { 
    "_default_": { 
     "properties": { 
      "type": { "type": "string", "index": "not_analyzed" }, 
      "type_value": { "type": "string", "index": "not_analyzed" }, 
      "groups": { "type": "integer" } 
     } 
    } 
} 

Wenn Sie nur einen Typ im Index haben, können Sie explizit auf

ändern stattdessen eine Zuordnung für diesen Typ definieren.

Sobald Sie dies getan haben, Ihre C# POCO ändern

public class CorrelationGroup 
{ 
    [Keyword] 
    public string Type { get; set; } 

    [Keyword(Name = "type_value")] 
    public string TypeValue { get; set; } 

    public List<int> Groups { get; set; } 
} 

Wenn Sie Elasticsearch 5.x verwenden, sollten Sie die keyword Art verwenden, die auf die ältere not_analyzedstring Typ zuordnet. Darüber hinaus müssen Sie nur den Namen für TypeValue angeben, da es eine Schlangenhülle verwendet (NEST-Client versteht die Kamelfallbenennung von Elasticsearch und wird den POCO-Eigenschaftsnamen von Pascal-Fällen zugeordnet). Schließlich habe ich die Groups Eigenschaft geändert, um eine int Liste zu sein.

+0

Vielen Dank für Ihre ausführliche Antwort. Ich habe deinen Vorschlag ausprobiert, aber logstash beschwert sich, dass er String nicht in int konvertieren kann. – Cemre

+0

Sie müssen diesen Index löschen und neu erstellen (ich nehme an, das ist an dieser Stelle in Ordnung). Logstash sollte den richtigen JSON senden. Kannst du auch nach 'stdout' ausgeben um das zu überprüfen? –

+0

Okay, wenn man sich die Stdout anschaut, scheint es so zu sein. Eine Sache, die ich tun musste, war, die JSON-Datei in eine einzige Zeile zu bringen. Allerdings sehe ich die Spalte "groups" nicht in der GUI (head plugin). Irgendeine Idee warum das ist? – Cemre

Verwandte Themen