diff --git a/src/adapter/elasticsearch.ts b/src/adapter/elasticsearch.ts
index baf7386e98358b0c9bf738d1bc9b83ec6c8cceb0..d3de47bc8c4f9b40d3c0eb1cf579b2b7141aafc0 100644
--- a/src/adapter/elasticsearch.ts
+++ b/src/adapter/elasticsearch.ts
@@ -1,6 +1,7 @@
 import { View } from "../core/view";
 import { Source } from "../core/source";
 import { FilterOperator } from "../core/filter";
+import { Metric } from "../core/metric";
 import { Adapter } from "../core/adapter";
 import { DataType, AggregationType } from "../common/types";
 import { Client, ConfigOptions } from "elasticsearch";
@@ -70,10 +71,10 @@ export class ElasticsearchAdapter extends Adapter {
      */
     public getDataFromView(view: View, cb: (error: Error, result?: any[]) => void): void {
 		const query = this.getQueryFromView(view);
-		if (view.clauses.length == 0 || view.dimensions.length > 1) {
-			this.executeQuery(view.operation.values[0].name, query, cb);
-		} else {
+		if (view.clauses.length > 0 || view.dimensions.length == 1) {
 			this.executeQuery(view.operation.values[0].operation.values[0].name, query, cb);
+		} else {
+			this.executeQuery(view.operation.values[0].name, query, cb);
 		}
     }
 
@@ -129,7 +130,7 @@ export class ElasticsearchAdapter extends Adapter {
 			let partialQuery = {};
 			for (let i=0; i<view.metrics.length; i++) {
 				func = this.getAggregateFunction(view.metrics[i].aggregation);
-				aggrName = func + "_" + view.metrics[i].name.toLowerCase();
+				aggrName = view.metrics[i].name.toLowerCase();
 				Object.assign(partialQuery, { [aggrName]: {[func]: {field: view.metrics[i].name}}});
 			}
 			return partialQuery;
@@ -137,18 +138,29 @@ export class ElasticsearchAdapter extends Adapter {
 		let returnedQuery = this.translateAggs(view, numDimensions+1);
 
 		if (view.dimensions.length > 0) {
-		let group_by = "group_by_" + view.dimensions[numDimensions].name;
-		let aggregation = {
-			[group_by]: {
-				terms: {
-        			field: view.dimensions[numDimensions].name + ".keyword",
-        			size: 100000
-				},
-				aggs: {}
+			let group_by = "group_by_" + view.dimensions[numDimensions].name;
+			let dim = view.dimensions[numDimensions].name;
+			if (view.dimensions[numDimensions].dataType < 3) {
+				dim = dim;
+			} else {
+				dim = dim + ".keyword";
+			}
+			let aggregation = {
+				[group_by]: {
+					terms: {
+        				field: dim,
+        				size: 100000
+					},
+					aggs: {}
+				}
+			};
+			
+			Object.assign(aggregation[group_by], {aggs: returnedQuery});
+
+			if (numDimensions == view.dimensions.length - 1 && view.sort.length > 0) {
+				let aggrName = view.sort[0].name.toLowerCase();
+				Object.assign(aggregation[group_by].terms, {order: {[aggrName] : "asc"}});
 			}
-		};
-		
-		Object.assign(aggregation[group_by], {aggs: returnedQuery});
 			
 			return aggregation;
 		}