2017-01-25 3 views
2

Ich indizierten Dokumente haben, die wie folgt aussehen:Sum Feldlänge Elasticsearch

{ 
    "fun_field": [...] 
} 

ich sehr viel möchten, dass der Array Längen summieren sich die Gesamtzahl der Elemente in allen fun_field Arrays zu erhalten. Ich habe viele Kombinationen ausprobiert und konnte es nicht zur Arbeit bringen.

Spricht jemand den kryptischen elastischenSuchdialekt fließend genug, um zu beschreiben, was ich frage?

Antwort

1

Nun habe ich einen Umweg gefunden, diese Frage zu beantworten, ohne Skripte zu verwenden.

{ 
    "size": 0, 
    "aggs" : { 
     "outer_agg" : { 
      "nested" : { 
       "path" : "elements" 
      }, 
      "aggs": { 
       "inner_agg": { 
        "top_hits": { 
         "from": 0, 
         "size": 1 
        } 
       } 
      } 
     } 
    } 
} 

Dies wird eine doc_count zurückgeben, was ich suche. ES DSL wird der Tod von mir sein.

1

Sie können eigene Skripts für Aggregationen (oder script_fields) definieren, sodass sie das Array bereits vor der Aggregation summieren. Die Syntax kann für verschiedene Skriptsprachen unterschiedlich sein, aber für Painless in Elasticsearch 5. Sie müssen auch Inline-Skripte aktivieren.

"aggs": { 
    "array_sums" : { 
    "sum": { 
     "script": { 
     "lang": "painless", 
     "inline": "doc['fun_field'].length" 
     } 
    } 
    } 
} 

Es gibt andere Skriptsprachen, Sie können darüber lesen here. Es gibt einige Beispiele für Skripts in Aggregationen here.

+0

Ich bekomme den folgenden Fehler, aber auch Wenn ich dieses Skript richtig lese, fügt es die Werte in den Arrays zusammen. I die Summe der Array-Größen, nicht die Summe der Werte in den Arrays. "script_stack": [ "org.elasticsearch.search.lookup.LeafDocLookup.get (LeafDocLookup.java:80)" "doc [ 'fun_field'] Länge" "^ ---- HIER" ], –

+0

(Scrollen Sie nach rechts von diesem Code) Von 0 -> Länge dieses Felds fügt es den Wert dieses Elements in die Summe ein. Das wird dann wieder in der Aggregation verwendet. Bitte überprüfen Sie die Version von elasticsearch und ob Sie Inline-Skripte aktiviert haben –

+0

Oh. Ich habe gerade erkannt, dass du das Array LENGTH wolltest, lol, das ist noch einfacher! –

Verwandte Themen