UNPKG

elastic.js

Version:

Javascript API for ElasticSearch DSL

372 lines (293 loc) 12.2 kB
/** @class A <code>MatchQuery</code> is a type of <code>Query</code> that accepts text/numerics/dates, analyzes it, generates a query based on the <code>MatchQuery</code> type. @name ejs.MatchQuery @ejs query @borrows ejs.QueryMixin._type as _type @borrows ejs.QueryMixin.toJSON as toJSON @desc A Query that appects text, analyzes it, generates internal query based on the MatchQuery type. @param {String} field the document field/field to query against @param {String} qstr the query string */ ejs.MatchQuery = function (field, qstr) { var _common = ejs.QueryMixin('match'), query = _common.toJSON(); query.match[field] = { query: qstr }; return extend(_common, { /** Sets the query string for the <code>Query</code>. @member ejs.MatchQuery @param {String} qstr The query string to search for. @returns {Object} returns <code>this</code> so that calls can be chained. */ query: function (qstr) { if (qstr == null) { return query.match[field].query; } query.match[field].query = qstr; return this; }, /** Sets the type of the <code>MatchQuery</code>. Valid values are boolean, phrase, and phrase_prefix. @member ejs.MatchQuery @param {String} type Any of boolean, phrase, phrase_prefix. @returns {Object} returns <code>this</code> so that calls can be chained. */ type: function (type) { if (type == null) { return query.match[field].type; } type = type.toLowerCase(); if (type === 'boolean' || type === 'phrase' || type === 'phrase_prefix') { query.match[field].type = type; } return this; }, /** Sets the fuzziness value for the <code>Query</code>. @member ejs.MatchQuery @param {Double} fuzz A <code>double</code> value between 0.0 and 1.0. @returns {Object} returns <code>this</code> so that calls can be chained. */ fuzziness: function (fuzz) { if (fuzz == null) { return query.match[field].fuzziness; } query.match[field].fuzziness = fuzz; return this; }, /** Sets the maximum threshold/frequency to be considered a low frequency term in a <code>CommonTermsQuery</code>. Set to a value between 0 and 1. @member ejs.MatchQuery @param {Number} freq A positive <code>double</code> value. @returns {Object} returns <code>this</code> so that calls can be chained. */ cutoffFrequency: function (freq) { if (freq == null) { return query.match[field].cutoff_frequency; } query.match[field].cutoff_frequency = freq; return this; }, /** Sets the prefix length for a fuzzy prefix <code>MatchQuery</code>. @member ejs.MatchQuery @param {Integer} l A positive <code>integer</code> length value. @returns {Object} returns <code>this</code> so that calls can be chained. */ prefixLength: function (l) { if (l == null) { return query.match[field].prefix_length; } query.match[field].prefix_length = l; return this; }, /** Sets the max expansions of a fuzzy <code>MatchQuery</code>. @member ejs.MatchQuery @param {Integer} e A positive <code>integer</code> value. @returns {Object} returns <code>this</code> so that calls can be chained. */ maxExpansions: function (e) { if (e == null) { return query.match[field].max_expansions; } query.match[field].max_expansions = e; return this; }, /** Sets default operator of the <code>Query</code>. Default: or. @member ejs.MatchQuery @param {String} op Any of "and" or "or", no quote characters. @returns {Object} returns <code>this</code> so that calls can be chained. */ operator: function (op) { if (op == null) { return query.match[field].operator; } op = op.toLowerCase(); if (op === 'and' || op === 'or') { query.match[field].operator = op; } return this; }, /** Sets the default slop for phrases. If zero, then exact phrase matches are required. Default: 0. @member ejs.MatchQuery @param {Integer} slop A positive <code>integer</code> value. @returns {Object} returns <code>this</code> so that calls can be chained. */ slop: function (slop) { if (slop == null) { return query.match[field].slop; } query.match[field].slop = slop; return this; }, /** Sets the analyzer name used to analyze the <code>Query</code> object. @member ejs.MatchQuery @param {String} analyzer A valid analyzer name. @returns {Object} returns <code>this</code> so that calls can be chained. */ analyzer: function (analyzer) { if (analyzer == null) { return query.match[field].analyzer; } query.match[field].analyzer = analyzer; return this; }, /** Sets a percent value controlling how many "should" clauses in the resulting <code>Query</code> should match. @member ejs.MatchQuery @param {Integer} minMatch An <code>integer</code> between 0 and 100. @returns {Object} returns <code>this</code> so that calls can be chained. */ minimumShouldMatch: function (minMatch) { if (minMatch == null) { return query.match[field].minimum_should_match; } query.match[field].minimum_should_match = minMatch; return this; }, /** Sets rewrite method. Valid values are: constant_score_auto - tries to pick the best constant-score rewrite method based on term and document counts from the query scoring_boolean - translates each term into boolean should and keeps the scores as computed by the query constant_score_boolean - same as scoring_boolean, expect no scores are computed. constant_score_filter - first creates a private Filter, by visiting each term in sequence and marking all docs for that term top_terms_boost_N - first translates each term into boolean should and scores are only computed as the boost using the top N scoring terms. Replace N with an integer value. top_terms_N - first translates each term into boolean should and keeps the scores as computed by the query. Only the top N scoring terms are used. Replace N with an integer value. Default is constant_score_auto. This is an advanced option, use with care. @member ejs.MatchQuery @param {String} m The rewrite method as a string. @returns {Object} returns <code>this</code> so that calls can be chained. */ rewrite: function (m) { if (m == null) { return query.match[field].rewrite; } m = m.toLowerCase(); if (m === 'constant_score_auto' || m === 'scoring_boolean' || m === 'constant_score_boolean' || m === 'constant_score_filter' || m.indexOf('top_terms_boost_') === 0 || m.indexOf('top_terms_') === 0) { query.match[field].rewrite = m; } return this; }, /** Sets fuzzy rewrite method. Valid values are: constant_score_auto - tries to pick the best constant-score rewrite method based on term and document counts from the query scoring_boolean - translates each term into boolean should and keeps the scores as computed by the query constant_score_boolean - same as scoring_boolean, expect no scores are computed. constant_score_filter - first creates a private Filter, by visiting each term in sequence and marking all docs for that term top_terms_boost_N - first translates each term into boolean should and scores are only computed as the boost using the top N scoring terms. Replace N with an integer value. top_terms_N - first translates each term into boolean should and keeps the scores as computed by the query. Only the top N scoring terms are used. Replace N with an integer value. Default is constant_score_auto. This is an advanced option, use with care. @member ejs.MatchQuery @param {String} m The rewrite method as a string. @returns {Object} returns <code>this</code> so that calls can be chained. */ fuzzyRewrite: function (m) { if (m == null) { return query.match[field].fuzzy_rewrite; } m = m.toLowerCase(); if (m === 'constant_score_auto' || m === 'scoring_boolean' || m === 'constant_score_boolean' || m === 'constant_score_filter' || m.indexOf('top_terms_boost_') === 0 || m.indexOf('top_terms_') === 0) { query.match[field].fuzzy_rewrite = m; } return this; }, /** Set to false to use classic Levenshtein edit distance in the fuzzy query. @member ejs.MatchQuery @param {Boolean} trueFalse A boolean value @returns {Object} returns <code>this</code> so that calls can be chained. */ fuzzyTranspositions: function (trueFalse) { if (trueFalse == null) { return query.match[field].fuzzy_transpositions; } query.match[field].fuzzy_transpositions = trueFalse; return this; }, /** Enables lenient parsing of the query string. @member ejs.MatchQuery @param {Boolean} trueFalse A boolean value @returns {Object} returns <code>this</code> so that calls can be chained. */ lenient: function (trueFalse) { if (trueFalse == null) { return query.match[field].lenient; } query.match[field].lenient = trueFalse; return this; }, /** Sets what happens when no terms match. Valid values are "all" or "none". @member ejs.MatchQuery @param {String} q A no match action, "all" or "none". @returns {Object} returns <code>this</code> so that calls can be chained. */ zeroTermsQuery: function (q) { if (q == null) { return query.match[field].zero_terms_query; } q = q.toLowerCase(); if (q === 'all' || q === 'none') { query.match[field].zero_terms_query = q; } return this; }, /** Sets the boost value for documents matching the <code>Query</code>. @member ejs.MatchQuery @param {Number} boost A positive <code>double</code> value. @returns {Object} returns <code>this</code> so that calls can be chained. */ boost: function (boost) { if (boost == null) { return query.match[field].boost; } query.match[field].boost = boost; return this; }, }); };