2016-05-26 9 views
1

In meinem ES ich ein Schematyp wie diese haben:Elasticsearch Aggregation über innere Objekt

{ 
    "index_v1":{ 
    "mappings":{ 
     "fuas":{ 
     "properties":{ 
      "comment":{ 
      "type":"string" 
      }, 
      "matter":{ 
      "type":"string" 
      }, 
      "metainfos":{ 
      "properties":{ 
       "department":{ 
       "type":"string" 
       }, 
       "processos":{ 
       "type":"string" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Kurz, hat fuas Typ zwei Eigenschaften comment und matter und einen inneren (nicht verschachtelt) Objekt metainfos mit mehreren Eigenschaften department und processos.

Ich würde gerne wissen, wie viele metainfos' fields mit seiner Anzahl von Vorkommen informiert werden.

Stellen Sie sich ein Dokument doc1 mit metainfos: {department: "d1"} und doc2 mit metainfos: {department: "d2", processos: "p1"}.

Dann würde ich gerne bekommen: {department: 2, processos: 1}.

EDIT

Als inneres Objekt und da ES schemaless Dokumente metainfos innere Objekte mehr Felder informiert oder nicht haben können.

So, doc1's metainfos {field1: 1, field3: 3} und doc2's metainfos {field2: 1, field4: 5} und doc3's metainfos {field1:2, field4: 2, field5: 1}.

Ich möchte erhalten: {field1: 2, field2: 1, field3: 1, field4: 2, field5: 1}. Ich denke, das Hauptproblem, um es zu lösen, ist, wie ich nach Feldern fragen kann, von denen ich nicht weiß, dass sie existieren.

Ich habe mit zwei Dokumente geprüft:

{ 
    "hits":{ 
    "total":2, 
    "max_score":1.0, 
    "hits":[ 
     { 
     "_source":{ 
      "matter":"FUA2", 
      "comment":null, 
      "metainfos":[ 
      { 
       "department":"d1" 
      } 
      ] 
     } 
     }, 
     { 
     "_source":{ 
      "matter":"FUA1", 
      "comment":"vcvcvc", 
      "metainfos":[ 
      { 
       "department":"d1" 
      }, 
      { 
       "processos":"p1" 
      } 
      ] 
     } 
     } 
    ] 
    } 
} 

ich dies mit diesem Befehl getestet haben:

curl -XGET 'http://localhost:9201/living_team/fuas/_search?pretty' -d ' 
{ 
    "size": 0, 
    "aggregations" : { 
    "followUpActivity.metainfo.department" : { 
     "terms" : { 
     "field" : "metainfos.*" 
     } 
    } 
    } 
} 
' 

Die Ergebnisse waren:

{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2, 
    "max_score" : 0.0, 
    "hits" : [ ] 
    }, 
    "aggregations" : { 
    "followUpActivity.metainfo.department" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ ] 
    } 
    } 
} 

Antwort

0

Sie verwenden die value_count aggregation dafür:

{ 
    "size": 0, 
    "aggs" : { 
     "dept" : { 
      "value_count" : { "field" : "metainfos.department" } 
     }, 
     "proc" : { 
      "value_count" : { "field" : "metainfos.processos" } 
     } 
    } 
} 
+0

Mein Problem ist mein Mapping dynamisch Ich schaffe, so dass die Felder dieses innered Objekt kann das Hinzufügen eines weiteren Feldes ändern. Also würde ich eine Art zusätzliche Aggregation benötigen, um nach dem Feld im inneren Objekt fragen zu können. – Jordi

+0

Sie können einfach versuchen, '" Feld ":" Metainfos. * "' – Val

+0

Ich habe dies bereits versucht. Ich habe es auf dem Post gemeldet. Es scheint, dass etwas nicht stimmt ... Mache ich etwas falsch? – Jordi

0

Sie müssen verschachtelte Felder verwenden, da andernfalls Ihre inneren Felder im Metainfos-Objekt nicht "zusammen" angezeigt werden.

Siehe hier: ElasticSearch aggregation over inner object

+0

Ich denke, das ist ein weiteres Problem. Ich glaube, das ist der Unterschied zwischen inneren (ich meine "nicht verschachtelt") und verschachtelten Objekten. Glauben Sie trotzdem, dass die letzte Abfrage korrekt ausgeführt wird? Einfach verschachtelte Felder verwenden? – Jordi

+0

Wenn Sie nested_fields verwenden, müssen Sie die Abfrage oder agg so ändern, dass eine verschachtelte Abfrage oder eine verschachtelte Aggregation verwendet wird. Schauen Sie sich die Referenz an, es sollte einige Beispiele geben. –

Verwandte Themen