diff --git a/public/app/plugins/datasource/elasticsearch/config_ctrl.ts b/public/app/plugins/datasource/elasticsearch/config_ctrl.ts index 4c14e1133bf..c5b65dd3026 100644 --- a/public/app/plugins/datasource/elasticsearch/config_ctrl.ts +++ b/public/app/plugins/datasource/elasticsearch/config_ctrl.ts @@ -24,6 +24,7 @@ export class ElasticConfigCtrl { esVersions = [ {name: '1.x', value: 1}, {name: '2.x', value: 2}, + {name: '5.x', value: 5}, ]; indexPatternTypeChanged() { diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index c7c2351d0cc..4e1329dc2ab 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -182,7 +182,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes luceneQuery = luceneQuery.substr(1, luceneQuery.length - 2); esQuery = esQuery.replace("$lucene_query", luceneQuery); - var searchType = queryObj.size === 0 ? 'count' : 'query_then_fetch'; + var searchType = (queryObj.size === 0 && this.esVersion < 5) ? 'count' : 'query_then_fetch'; var header = this.getQueryHeader(searchType, options.range.from, options.range.to); payload += header + '\n'; @@ -243,7 +243,8 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes this.getTerms = function(queryDef) { var range = timeSrv.timeRange(); - var header = this.getQueryHeader('count', range.from, range.to); + var searchType = this.esVersion >= 5 ? 'query_then_fetch' : 'count' ; + var header = this.getQueryHeader(searchType, range.from, range.to); var esQuery = angular.toJson(this.queryBuilder.getTermsQuery(queryDef)); esQuery = esQuery.replace("$lucene_query", queryDef.query || '*'); @@ -251,7 +252,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes esQuery = esQuery.replace(/\$timeTo/g, range.to.valueOf()); esQuery = header + '\n' + esQuery + '\n'; - return this._post('/_msearch?search_type=count', esQuery).then(function(res) { + return this._post('/_msearch?search_type=' + searchType, esQuery).then(function(res) { var buckets = res.responses[0].aggregations["1"].buckets; return _.map(buckets, function(bucket) { return {text: bucket.key, value: bucket.key}; diff --git a/public/app/plugins/datasource/elasticsearch/query_builder.js b/public/app/plugins/datasource/elasticsearch/query_builder.js index 9c8217102aa..09b1d7ce8f1 100644 --- a/public/app/plugins/datasource/elasticsearch/query_builder.js +++ b/public/app/plugins/datasource/elasticsearch/query_builder.js @@ -75,14 +75,23 @@ function (queryDef) { for (var i = 0; i < aggDef.settings.filters.length; i++) { var query = aggDef.settings.filters[i].query; - filterObj[query] = { - query: { + if (this.esVersion >= 5) { + filterObj[query] = { query_string: { query: query, analyze_wildcard: true } - } - }; + }; + } else { + filterObj[query] = { + query: { + query_string: { + query: query, + analyze_wildcard: true + } + } + }; + } } return filterObj; @@ -106,24 +115,43 @@ function (queryDef) { target.timeField = this.timeField; var i, nestedAggs, metric; - var query = { - "size": 0, - "query": { - "filtered": { - "query": { - "query_string": { - "analyze_wildcard": true, - "query": '$lucene_query', - } - }, - "filter": { - "bool": { - "must": [{"range": this.getRangeFilter()}] + var query = {}; + if (this.esVersion >= 5) { + query = { + "size": 0, + "query": { + "bool": { + "must": [ + {"range": this.getRangeFilter()}, + {"query_string": { + "analyze_wildcard": true, + "query": '$lucene_query' + } + } + ] + } + } + }; + } else { + query = { + "size": 0, + "query": { + "filtered": { + "query": { + "query_string": { + "analyze_wildcard": true, + "query": '$lucene_query', + } + }, + "filter": { + "bool": { + "must": [{"range": this.getRangeFilter()}] + } } } } - } - }; + }; + } // handle document query if (target.bucketAggs.length === 0) { @@ -199,24 +227,43 @@ function (queryDef) { }; ElasticQueryBuilder.prototype.getTermsQuery = function(queryDef) { - var query = { - "size": 0, - "query": { - "filtered": { - "query": { - "query_string": { - "analyze_wildcard": true, - "query": '$lucene_query', - } - }, - "filter": { - "bool": { - "must": [{"range": this.getRangeFilter()}] + var query = {}; + if (this.esVersion >= 5) { + query = { + "size": 0, + "query": { + "bool": { + "must": [ + {"range": this.getRangeFilter()}, + {"query_string": { + "analyze_wildcard": true, + "query": '$lucene_query' + } + } + ] + } + } + }; + } else { + query = { + "size": 0, + "query": { + "filtered": { + "query": { + "query_string": { + "analyze_wildcard": true, + "query": '$lucene_query', + } + }, + "filter": { + "bool": { + "must": [{"range": this.getRangeFilter()}] + } } } } - } - }; + }; + } query.aggs = { "1": { "terms": {