From 17e040abe4cfb39b1a606da10fd71ca08e6e48cf Mon Sep 17 00:00:00 2001 From: Ed Dawley Date: Tue, 9 Sep 2014 15:17:13 -0400 Subject: [PATCH] The elasticsearch datasource will now better handle language specifics when making the search partial (ie for search as you type). This means the search field will now support significantly more complex searches such as: title:foo AND title:bar OR baz title:mysql AND [3306 TO 3308] web~ title:foo AND -bar --- .../services/elasticsearch/es-datasource.js | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/app/services/elasticsearch/es-datasource.js b/src/app/services/elasticsearch/es-datasource.js index 3b36d17b2a3..dd5fb1020ac 100644 --- a/src/app/services/elasticsearch/es-datasource.js +++ b/src/app/services/elasticsearch/es-datasource.js @@ -209,7 +209,21 @@ function (angular, _, config, kbn, moment) { }; ElasticDatasource.prototype.searchDashboards = function(queryString) { - queryString = queryString.toLowerCase().replace(' and ', ' AND '); + var endsInOpen = function(string, opener, closer) { + var character; + var count = 0; + for (var i=0; i 0; + } var tagsOnly = queryString.indexOf('tags!:') === 0; if (tagsOnly) { @@ -221,7 +235,21 @@ function (angular, _, config, kbn, moment) { queryString = 'title:'; } - if (queryString[queryString.length - 1] !== '*') { + // make this a partial search if we're not in some reserved portion of the language, comments on conditionals, in order: + // 1. ends in reserved character, boosting, boolean operator ( -foo) + // 2. typing a reserved word like AND, OR, NOT + // 3. open parens (groupiing) + // 4. open " (term phrase) + // 5. open [ (range) + // 6. open { (range) + // see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax + if (!queryString.match(/(\*|\]|}|~|\)|"|^\d+|\s[\-+]\w+)$/) && + !queryString.match(/[A-Z]$/) && + !endsInOpen(queryString, '(', ')') && + !endsInOpen(queryString, '"', '"') && + !endsInOpen(queryString, '[', ']') && !endsInOpen(queryString, '[', '}') && + !endsInOpen(queryString, '{', ']') && !endsInOpen(queryString, '{', '}') + ){ queryString += '*'; } }