2015-07-21 7 views
9

Supponiamo di avere un indice per le auto sul lotto di un concessionario. Ogni documento è simile al seguente:Come si calcolano le faccette/aggregazioni per i primi n documenti, con paginazione in Elasticsearch?

{ 
    color: 'red', 
    model_year: '2015', 
    date_added: '2015-07-20' 
} 

Supponiamo di avere un milione di automobili.

Supponiamo di voler presentare una vista delle 1000 auto aggiunte più di recente, oltre a sfaccettature su quelle 1000 auto.

ho potuto solo usare from e size per impaginare i risultati fino ad un limite fisso di 1000, ma in questo modo i totali e le sfaccettature su model_year e color (cioè aggregazioni) torno da elasticsearch non sono destra- sono sopra l'intera serie abbinata.

Come posso limitare la mia ricerca a la più recente aggiunta 1000 documenti per l'impaginazione e aggregazione?

+0

Puoi mostrare la query che stai utilizzando? – Val

+0

@ Val- la parte della query non è così interessante e potrebbe anche essere un tuttofare. per esempio. '{ "sort": { "DATE_ADDED": { "ordine": "disc" }} }' –

+0

impaginazione è [impossibile] (https://github.com/elastic/elasticsearch/issues/4915) per il risultato di una aggregazione. –

risposta

1

Come probabilmente visto nella documentazione, le aggregazioni vengono eseguite nell'ambito della query stessa. Se non viene fornita alcuna query, le aggregazioni vengono eseguite su un elenco di risultati match_all. Anche se dovessi utilizzare size a livello di query, non ti darà ancora ciò di cui hai bisogno perché size è solo un modo di restituire un set di documenti da tutti i documenti corrispondenti alla query. Le aggregazioni operano su ciò che corrisponde alla query.

Questa richiesta di funzionalità non è nuova ed è stata asked for before qualche tempo fa.

Nella versione 1.7 non esiste una soluzione immediata. Forse puoi usare il parametro di richiesta in-body limit filter o terminate_after, ma questo non restituirà i documenti che sono stati anche ordinati. Questo ti darà il primoterminate_after numero di documenti che corrispondono alla query e questo numero è per frammento. Questo non viene eseguito dopo l'applicazione dell'ordinamento.

In ES 2.0 è inoltre disponibile sampler aggregation che funziona più o meno allo stesso modo di terminate_after, ma questo prende in considerazione il punteggio dei documenti da considerare da ogni frammento. Nel caso in cui si ordina solo dopo date_added e la query è solo un match_all tutti i documenti avranno lo stesso punteggio e verrà restituito un insieme di documenti irrilevante.

In conclusione:

  • non c'è buona soluzione per questo, ci sono soluzioni alternative con numero di documenti per frammento. Quindi, se si vuole 1000 auto, allora avete bisogno di prendere questo numero dividerlo per il numero di frammenti primari, utilizzarlo in sampler aggregazione o con terminate_after e ottenere una serie di documenti

  • il mio suggerimento è quello di uso di un query per limitare il numero di documenti (auto) con un altro criterio. Ad esempio, mostra (e aggrega) le auto negli ultimi 30 giorni o qualcosa di simile. Significa che i criteri devono essere inclusi nella query stessa, in modo che il set di documenti risultante sia quello che si desidera venga aggregato. L'applicazione di aggregazioni a un certo numero di documenti, dopo che sono stati ordinati, non è facile.