2016-07-19 11 views
0

Ich bin auf der Suche nach einigen Zeigern auf die Zuordnung einer etwas dynamischen Struktur für den Verbrauch von Elasticsearch.Elasticsearch Mapping der verschachtelten Struktur

Die rohe Struktur selbst ist json, aber das Problem ist, dass ein Teil der Struktur eine Variable enthält und nicht die äußeren Elemente der Struktur statisch sind.

eine etwas geschwärzten Beispiel zu bieten, sieht meine Json wie folgt aus:

"stat": { 
    "state": "valid", 
    "duration": 5, 
}, 
"12345-abc": { 
    "content_length": 5, 
    "version": 2 
} 
"54321-xyz": { 
    "content_length": 2, 
    "version", 1 
} 

Der erste Block ist einfach; Elasticsearch macht eine gute Arbeit beim Zuordnen des "stat" -Teils der Struktur, und wenn ich viele dieser Daten in einen Index ablegen würde, würde es wie erwartet funktionieren. Das Problem ist, dass die nächsten 2 Blöcke im Wesentlichen die gleiche Sache sind, aber der rohe JSON so formatiert ist, dass sich ein einzigartiges Element in die Struktur eingeschlichen hat, und Elasticsearch dies standardmäßig zuordnen möchte, erzeugt eine Map, die so aussieht :

"stat": { 
    "properties": { 
     "state": { 
      "type": "string" 
     }, 
     "duration": { 
      "type": "double" 
     } 
    } 
}, 
"12345-abc": { 
    "properties": { 
     "content_length": { 
      "type": "double" 
     }, 
     "version": { 
      "type": "double" 
     } 
    } 
}, 
"54321-xyz": { 
    "properties": { 
     "content_length": { 
      "type": "double" 
     }, 
     "version": { 
      "type": "double" 
     } 
    } 
} 

ich die Fähigkeit zu indizieren alle „content_length“ Daten erhalten möchten, aber es wird immer getrennt und mit einigen der Variablennamen verwendet werden, wenn ich die Daten in Kibana lasse ich aufzuwickeln mit wirklich lange Feldnamen, die neben nutzlos werden.

Ist es möglich, der Struktur ein generisches Tag zur Verfügung zu stellen? Oder wird dies in der json-generationsphase eher trivial behandelt, wobei unsere Entwickler einen generischen Strukturnamen hart codieren und einen Identifier-Feldnamen hinzufügen.

Jeder Einblick/Hilfe sehr geschätzt.

Danke!

+0

Ich verstehe nicht, was das gewünschte Verhalten ist. Was ist für die von Ihnen bereitgestellte Stichprobe die erwartete Zuordnung, die ES selbst erstellen sollte? –

+0

Ich möchte in der Lage sein, alle Datensätze für die gleiche Struktur zu aggregieren, aber der rohe JSON gibt die Namen der Strukturvariablen an. Das bedeutet auch, dass, wenn der JSON ein seltsames Problem hätte, wie ein numerischer Wert in Anführungszeichen, ich nicht in der Lage wäre, das Mapping zu überschreiben, ohne vorher zu wissen, wie die Strukturen aussehen werden, was nicht scheint praktisch. Nachdem dies gesagt wurde, denke ich immer mehr, dass dies auf die rohe JSON-Struktur zurückzuführen ist, und das ist der Punkt, an dem ich Änderungen vornehmen muss, wie unten im Kommentar von Ajaele erwähnt. – VirtualGreg

Antwort

1

Wenn Schlüssel wie 12345-abc generiert werden und möglicherweise unendliche Werte, wird es schwierig (wenn nicht unmöglich), einige nützliche Abfragen oder Aggregationen zu tun. Es ist nicht wirklich klar, welchen genauen Anwendungsfall Sie für die Analyse Ihrer Daten haben, aber Sie sollten sich wahrscheinlich nested objects (https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html) ansehen und Ihren Input json entsprechend dem generieren, nach dem Sie suchen möchten. Es scheint, dass Sie bessere Aggregationsergebnisse erhalten, wenn Sie diese zusätzlichen Objekte in ein Array mit einem speziellen Feld einfügen, das den aktuellen Schlüssel enthält.

{ 
    "stat": ..., 
    "things": [ 
    { 
     "thingkey": "12345-abc", 
     "content_length": 5, 
     "version": 2 
    }, 
    ... 
    ] 
} 
+0

Die Strukturen repräsentieren Knoten in einem verteilten System, also ist Aggregation der Schlüssel, und wie wir zustimmen, wird gebrochen wie es ist. Ich habe geschachtelte Strukturen ziemlich online betrachtet, aber die gesamte Dokumentation verweist auf Strukturen, die statisch benannt sind, wie das Beispiel "stat". Ich denke, ich muss mit den Jungs diskutieren, die den JSON generieren, um zu sehen, welche Möglichkeiten wir haben. Wenn den "Dingen" ein generischer Name wie in Ihrem Beispiel gegeben wurde, könnte ich bestimmte Entitäten in Kibana mit Filtern und Term-Restriktionen isolieren. Danke für die Bestätigung meines Verdachts. – VirtualGreg

+0

Ich habe weitere Zeit damit verbracht, mit Dingen zu spielen und Werte aus Schlüsseln aus der Struktur massiv zu vereinfachen, wie dies hier vorgeschlagen wird. Das nächste Problem war, dass Kibana verschachtelte Abfragen scheinbar nicht unterstützt, sobald ich diese Daten richtig in elasticsearch hatte ... seufzen. Danke für die schnelle Abwicklung ajaegle – VirtualGreg

Verwandte Themen