elastic.js
Version:
Javascript API for ElasticSearch DSL
207 lines (160 loc) • 6.89 kB
JavaScript
/**
@class
<p>A fuzzy search query based on the Damerau-Levenshtein (optimal string
alignment) algorithm, though you can explicitly choose classic Levenshtein
by passing false to the transpositions parameter./p>
<p>fuzzy query on a numeric field will result in a range query “around”
the value using the min_similarity value. As an example, if you perform a
fuzzy query against a field value of "12" with a min similarity setting
of "2", the query will search for values between "10" and "14".</p>
@name ejs.FuzzyQuery
@ejs query
@borrows ejs.QueryMixin._type as _type
@borrows ejs.QueryMixin.toJSON as toJSON
@desc
<p>Constructs a query where each documents returned are “like” provided text</p>
@param {String} field The field to run the fuzzy query against.
@param {String} value The value to fuzzify.
*/
ejs.FuzzyQuery = function (field, value) {
var
_common = ejs.QueryMixin('fuzzy'),
query = _common.toJSON();
query.fuzzy[field] = {
value: value
};
return extend(_common, {
/**
<p>The field to run the query against.</p>
@member ejs.FuzzyQuery
@param {String} f A single field name.
@returns {Object} returns <code>this</code> so that calls can be chained.
*/
field: function (f) {
var oldValue = query.fuzzy[field];
if (f == null) {
return field;
}
delete query.fuzzy[field];
field = f;
query.fuzzy[f] = oldValue;
return this;
},
/**
<p>The query text to fuzzify.</p>
@member ejs.FuzzyQuery
@param {String} s A text string.
@returns {Object} returns <code>this</code> so that calls can be chained.
*/
value: function (txt) {
if (txt == null) {
return query.fuzzy[field].value;
}
query.fuzzy[field].value = txt;
return this;
},
/**
<p>Set to false to use classic Levenshtein edit distance.</p>
@member ejs.FuzzyQuery
@param {Boolean} trueFalse A boolean value
@returns {Object} returns <code>this</code> so that calls can be chained.
*/
transpositions: function (trueFalse) {
if (trueFalse == null) {
return query.fuzzy[field].transpositions;
}
query.fuzzy[field].transpositions = trueFalse;
return this;
},
/**
<p>The maximum number of query terms that will be included in any
generated query. Defaults to <code>50</code>.<p>
@member ejs.FuzzyQuery
@param {Integer} max A positive integer value.
@returns {Object} returns <code>this</code> so that calls can be chained.
*/
maxExpansions: function (max) {
if (max == null) {
return query.fuzzy[field].max_expansions;
}
query.fuzzy[field].max_expansions = max;
return this;
},
/**
<p>The minimum similarity of the term variants. Defaults to <code>0.5</code>.</p>
@member ejs.FuzzyQuery
@param {Double} min A positive double value.
@returns {Object} returns <code>this</code> so that calls can be chained.
*/
minSimilarity: function (min) {
if (min == null) {
return query.fuzzy[field].min_similarity;
}
query.fuzzy[field].min_similarity = min;
return this;
},
/**
<p>Length of required common prefix on variant terms. Defaults to <code>0</code>.</p>
@member ejs.FuzzyQuery
@param {Integer} len A positive integer value.
@returns {Object} returns <code>this</code> so that calls can be chained.
*/
prefixLength: function (len) {
if (len == null) {
return query.fuzzy[field].prefix_length;
}
query.fuzzy[field].prefix_length = len;
return this;
},
/**
<p>Sets rewrite method. Valid values are:</p>
<dl>
<dd><code>constant_score_auto</code> - tries to pick the best constant-score rewrite
method based on term and document counts from the query</dd>
<dd><code>scoring_boolean</code> - translates each term into boolean should and
keeps the scores as computed by the query</dd>
<dd><code>constant_score_boolean</code> - same as scoring_boolean, expect no scores
are computed.</dd>
<dd><code>constant_score_filter</code> - first creates a private Filter, by visiting
each term in sequence and marking all docs for that term</dd>
<dd><code>top_terms_boost_N</code> - first translates each term into boolean should
and scores are only computed as the boost using the top <code>N</code>
scoring terms. Replace <code>N</code> with an integer value.</dd>
<dd><code>top_terms_N</code> - first translates each term into boolean should
and keeps the scores as computed by the query. Only the top <code>N</code>
scoring terms are used. Replace <code>N</code> with an integer value.</dd>
</dl>
<p>Default is <code>constant_score_auto</code>.</p>
<p>This is an advanced option, use with care.</p>
@member ejs.FuzzyQuery
@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.fuzzy[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.fuzzy[field].rewrite = m;
}
return this;
},
/**
<p>Sets the boost value of the <code>Query</code>.</p>
@member ejs.FuzzyQuery
@param {Double} 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.fuzzy[field].boost;
}
query.fuzzy[field].boost = boost;
return this;
}
});
};