2015-09-01 19 views
6

Non riesco a rendere il filtro + aggregazione elasticsearch per funzionare con i campi nidificati. Lo schema dei dati (parte rilevante) è come questo:L'aggregazione Elasticsearch non funziona con i campi di tipo annidato

"mappings": { 
    "rb": { 
    "properties": { 
     "project": { 
     "type": "nested", 
     "properties": { 
      "age": { 
      "type": "long" 
      }, 
      "name": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     }  
    } 
    } 
} 

Essenzialmente "rb" oggetto contiene un campo nidificato chiamato "progetto", che contiene altri due campi - "nome" e "l'età". Query sto correndo:

"aggs": { 
    "root": { 
    "aggs": { 
     "group": { 
     "aggs": { 
      "filtered": { 
      "aggs": { 
       "order": { 
       "percentiles": { 
        "field": "project.age", 
        "percents": ["50"] 
       } 
       } 
      }, 
      "filter": { 
       "range": { 
       "last_updated": { 
        "gte": "2015-01-01", 
        "lt": "2015-07-01" 
       } 
       } 
      } 
      } 
     }, 
     "terms": { 
      "field": "project.name", 
      "min_doc_count": 5, 
      "order": { 
      "filtered>order.50": "asc" 
      }, 
      "shard_size": 10, 
      "size": 10 
     } 
     } 
    }, 
    "nested": { 
     "path": "project" 
    } 
    } 
} 

Questa query dovrebbe produrre migliori 10 progetti (campo project.name), che corrispondono al filtro data, ordinato secondo la loro età media, ignorando i progetti con meno di 5 menziona nel database . La mediana deve essere calcolata solo per i progetti corrispondenti al filtro (intervallo di date).

Nonostante abbia più di centomila oggetti nel database, questa query produce un elenco vuoto. Nessun errore, solo una risposta vuota. Ho provato sia su ES 1.6 e ES 2.0-beta.

risposta

7

Ho riorganizzato la query di aggregazione un po 'e ho potuto visualizzare alcuni risultati. Il punto principale è il tipo poiché si sta aggregando attorno al tipo nested, ho eliminato l'aggregazione filter nel campo last_updated e spostato nella gerarchia come prima aggregazione. Segue l'aggregazione nested nel campo project e infine lo terms e lo percentile.

Sembra funzionare abbastanza bene. Per favore prova.

{ 
    "size": 0, 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "last_updated": { 
      "gte": "2015-01-01", 
      "lt": "2015-07-01" 
      } 
     } 
     }, 
     "aggs": { 
     "root": { 
      "nested": { 
      "path": "project" 
      }, 
      "aggs": { 
      "group": { 
       "terms": { 
       "field": "project.name", 
       "min_doc_count": 5, 
       "shard_size": 10, 
       "order": { 
        "order.50": "asc" 
       }, 
       "size": 10 
       }, 
       "aggs": { 
       "order": { 
        "percentiles": { 
        "field": "project.age", 
        "percents": [ 
         "50" 
        ] 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Funziona! Ho solo dovuto aumentare shard_size a 100 per ottenere effettivamente 10 valori indietro. Ti spiace spiegare perché la mia variante originale non ha funzionato? È una limitazione in ES che non supporta i filtri all'interno dei campi nidificati? – extesy

+1

All'interno di un'aggregazione 'nested' è possibile solo fare riferimento a campi nidificati. Inoltre, ha più senso filtrare prima i dati basati su 'last_updated' e solo successivamente per operare sui dati annidati. – Val

+0

@Val - Puoi dirmi come posso farlo per il bucket multivalore? Domanda separata - http://stackoverflow.com/questions/43451667/elasticsearch-ordering-aggregation-by-nested-aggregation-on-nested-field –

Problemi correlati