Search code examples
elasticsearchaggregation

Elasticsearch aggregation order by top hit score


I want to order buckets by doc.score of top_hit. My current implementation is below.

  group_by_iid: {
    terms: {
      field: 'iid',
      order: { max_score: 'desc' },
      size: 0
    },
    aggs: {
      max_score: { max: { script: 'doc.score' } },
      top_hit: {
        top_hits: {
          sort: [{ source_priority: { order: 'desc' } }],
          size: 1
        }
      }
    }
  }

This is wrong because buckets are ordered by their top score, not their top source_priority document's score. Is there a way to solve this problem?


Solution

  • I had the same issue, and the way I resolved it was to introduce a sub-aggregation on the docs score. Then in my outer aggregation, I ordered by name of the max_score aggregation.

    GET /my-index/my-type/_search

    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "searchTerm": {
                  "query": "style",
                  "type": "boolean"
                }
              }
            },
            {
              "flt_field": {
                "searchTerm": {
                  "like_text": "style"
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "group_by_target_url": {
          "terms": {
            "field": "targetUrl",
            "order": {
              "max_score": "desc"
            }
          },
          "aggs": {
            "max_score": {
              "max": {
                "script": "_score"
              }
            }
          }
        }
      }
    }
    

    I followed the directions on this link:

    http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html