2016-06-24 13 views
0

Ich habe die unten von documnets gesetzt
Gibt es eine Möglichkeit wir
Nested Histogramm Abfrage in Elasticsearch

{"id": 1, "regions" : 111, "category" : 6, "Price" : 957} 
{"id": 2, "regions" : 111, "category" : 6, "Price" : 829} 
{"id": 3, "regions" : 111, "category" : 7, "Price" : 123} 
{"id": 4, "regions" : 111, "category" : 7, "Price" : 129} 
{"id": 5, "regions" : 111, "category" : 8, "Price" : 351} 
{"id": 6, "regions" : 111, "category" : 8, "Price" : 225} 

{"id": 7, "regions" : 112, "category" : 6, "Price" : 625} 
{"id": 8, "regions" : 112, "category" : 6, "Price" : 599} 
{"id": 9, "regions" : 112, "category" : 7, "Price" : 256} 
{"id": 10, "regions" : 112, "category" : 7, "Price" : 129} 
{"id": 11, "regions" : 112, "category" : 8, "Price" : 333} 
{"id": 12, "regions" : 112, "category" : 8, "Price" : 444} 
{"id": 13, "regions" : 112, "category" : 9, "Price" : 199} 
{"id": 14, "regions" : 112, "category" : 9, "Price" : 149} 
{"id": 15, "regions" : 112, "category" : 5, "Price" : 299} 
{"id": 16, "regions" : 112, "category" : 5, "Price" : 349} 

Ich brauche eine verschachtelte Histogramm Suche in Elasticsearch machen können eine Abfrage machen (können einige verschachtelte sein Histogramm oder anderes), um die Ausgabe im folgenden Format zu erhalten:
Jede Region sollte eine eigene Kategorie mit dem niedrigsten Preis haben.


[{ 
     "regions" : 111, 
     [{ 
       "category" : 6, 
       "Price" : 829 
      }, { 
       "category" : 7, 
       "Price" : 123 
      }, { 
       "category" : 8, 
       "Price" : 225 
      } 
     ] 
    }, { 
     "regions" : 112, 
     [{ 
       "category" : 6, 
       "Price" : 599 
      }, { 
       "category" : 7, 
       "Price" : 129 
      }, { 
       "category" : 8, 
       "Price" : 333 
      }, { 
       "category" : 9, 
       "Price" : 149 
      }, { 
       "category" : 5, 
       "Price" : 299 
      } 
     ] 
    }, 
] 

Thx im Voraus

Antwort

0

Willkommen bei Stackoverflow. ElasticSearch spuckt die Daten nicht genau in dem von Ihnen angegebenen Format aus. Sie müssen eine Abfrage verwenden, um die gesuchten Ergebnisse herauszufiltern, und dann jedes Ergebnis durchgehen und die gewünschten Daten in die von Ihnen gewünschte Struktur einfügen.

0

Sie können die Daten mithilfe der API _bulk indizieren. Etwas wie folgt aus:

$ curl -XPOST localhost:9200/my_index/data/_bulk -d '{"index":{"_id":"1"}} 
{"regions" : 111, "category" : 6, "Price" : 957} 
{"index":{"_id":"2"}} 
{"regions" : 111, "category" : 6, "Price" : 829} 
{"index":{"_id":"3"}} 
{"regions" : 111, "category" : 7, "Price" : 123} 
{"index":{"_id":"4"}} 
{"regions" : 111, "category" : 7, "Price" : 129} 
{"index":{"_id":"5"}} 
{"regions" : 111, "category" : 8, "Price" : 351} 
{"index":{"_id":"6"}} 
{"regions" : 111, "category" : 8, "Price" : 225} 
' 

Leerzeilen sind wichtig, mit dem _bulk Endpunkt, so dass die Art und Weise ich verwendet habe, es war durchaus gewollt.

Dann würden Sie einen Index haben, die mit dem regions, category und Price indiziert als long Werte abgebildet wird. Von dort können Sie eine Aggregation zu bekommen, das Histogramm verwenden Sie für Fragen:

$ curl -XGET localhost:9200/my_index/_search -d '{ 
    "aggs": { 
    "group_by_region": { 
     "terms": { 
     "field": "regions", 
     "size": 10 
     }, 
     "aggs": { 
     "group_by_category": { 
      "terms": { 
      "field": "category", 
      "size": 10 
      }, 
      "min_price": { 
      "min": { 
       "field": "Price" 
      } 
      } 
     } 
     } 
    } 
    } 
}' 

Das wird die Ausgabe, wie Sie buchstäblich es nicht geben setzen, aber es wird Ihnen die Werte geben, die Sie suchen zum. Hinweis: Ich habe willkürliche Größen ausgewählt. Auch die Namen wie "group_by_region" liegen bei dir; Sie sind etwas, das Sie in der Antwort sehen werden, und der Name ist völlig willkürlich.