Percentile ranks aggregation представляет из себя соотношение данных к процентам. Т.е можно использовать для того чтобы узнать какой процент значения встречается в index.

Работает только с численными значениями.

Например вам нужно узнать равен ли время ответа вашего сайта (response time) 500 миллисекундам.

GET mylogs/_search
{
  "aggs": {
    "response_time_ranks": {
      "percentile_ranks": {
        "field": "FIELD1",   
        "values": [ 500, 600 ]
      }
    }
  }
}

И допустим на выходе вы получаете

{
  ...

 "aggregations": {
    "response_time_ranks": {
      "values": {
        "500.0": 90.01,
        "600.0": 100.0
      }
    }
  }
}

Из вывода видно что около 90% ответов вашего сервера соответствуют 500 мс, но есть около 10% ответ которых превышает 500 мс.

Т.е исходя из примера можно сказать что percentile_ranks ищет что >= первому числу или >= второму числу.

Keyed

По умолчанию keyed установлен со значением true. Keyed связывает уникальный строковый ключ с каждым сегментом и возвращает диапазоны в виде хеша, а не массива.

Для того чтобы вернуть в виде массива выставляем keyed в false.

GET mylogs/_search
{
  "aggs": {
    "response_time_ranks": {
      "percentile_ranks": {
        "field": "FIELD1",   
        "values": [ 500, 600 ],
        "keyed":  false
      }
    }
  }
}

И получаем массив

{
  ...

  "aggregations": {
    "load_time_ranks": {
      "values": [
        {
          "key": 500.0,
          "value": 90.01
        },
        {
          "key": 600.0,
          "value": 100.0
        }
      ]
    }
  }
}

Script

Также можно использовать percentile_ranks со script. Например вы можете использовать скрипт для перевода мс в секунды, используя деление на 1000.

GET mylogs/_search
{
  "size": 0,
  "aggs": {
    "response_time_ranks": {
      "percentile_ranks": {
        "values": [ 500, 600 ],
        "script": {
          "lang": "painless",
          "source": "doc['FIELD1'].value / params.timeUnit", 
          "params": {
            "timeUnit": 1000                                    
          }
        }
      }
    }
  }
}

Для сохраненного скрипта

GET mylogs/_search
{
  "size": 0,
  "aggs": {
    "response_time_ranks": {
      "percentile_ranks": {
        "values": [ 500, 600 ],
        "script": {
          "id": "my_script",
          "params": {
            "field": "FIELD1"
          }
      }
    }
  }
}

Missing

По умолчанию percentile_ranks отбрасывает документы с пустым значением. Чтобы учитывать такое значения можно выставить missing с цифровым значением, которое и будет заменять пустое значение.

GET mylogs/_search
{
  "aggs": {
    "response_time_ranks": {
      "percentile_ranks": {
        "field": "FIELD1",   
        "values": [ 500, 600 ],
        "missing": 10  
      }
    }
  }
}