sant016
sant016

Reputation: 345

Paging the top_hits aggregation in ElasticSearch

Right now I'm doing a top_hits aggregation in Elastic Search that groups my data by a field, sorts the groups by a date, and chooses the top 1.

I need to somehow page this aggregation results in a way that I can pass through the pageSize and the pageNumber, but I don't know how.

In addition to this, I also need the total results of this aggregation so we can show it in a table in our web interface.

The aggregation looks like this:

POST my_index/_search
{
  "size": 0,
  "aggs": {
    "top_artifacts": {
      "terms": {
        "field": "artifactId.keyword"
      },
      "aggs": {
        "top_artifacts_hits": {
          "top_hits": {
            "size": 1,
            "sort": [{
              "date": {
                "order": "desc"
              }
            }]
          }
        }
      }
    }
  }
} 

Upvotes: 2

Views: 1550

Answers (1)

Benjamin Trent
Benjamin Trent

Reputation: 7566

If I understand what you want, you should be able to do pagination through a Composite Aggregation. You can still pass your size parameter in your pagination, but your from would be the key for the bucket.

POST my_index/_search
{
  "size": 0, 
  "aggs": {
    "top_artifacts": {
      "composite": {
        "sources": [
          {
            "artifact": {
              "terms": {
                "field": "artifactId.keyword"
              }
            }
          }
        ]
        , 
        "size": 1, // OPTIONAL SIZE (How many buckets)
        "after": {
          "artifact": "FOO_BAZ" // Buckets after this bucket key
        }
      },
      "aggs": {
        "hits": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "timestamp": {
                  "order": "desc"
                }
              }
              ]
          }
        }
      }
    }
  }
}

Upvotes: 2

Related Questions