elastic-builder
Version:
A JavaScript implementation of the elasticsearch Query DSL
222 lines (203 loc) • 7.29 kB
JavaScript
'use strict';
const isNil = require('lodash.isnil');
const {
util: { invalidParam },
consts: { EXECUTION_HINT_SET }
} = require('../../core');
const BucketAggregationBase = require('./bucket-aggregation-base');
const invalidExecutionHintParam = invalidParam(
'',
'execution_hint',
EXECUTION_HINT_SET
);
/**
* The `TermsAggregationBase` provides support for common options used across
* various terms `Aggregation` implementations like Significant terms and
* Terms aggregation.
*
* **NOTE:** Instantiating this directly should not be required.
* However, if you wish to add a custom implementation for whatever reason,
* this class could be extended.
*
* @param {string} name The name which will be used to refer to this aggregation.
* @param {string} aggType Type of aggregation
* @param {string} refUrl Elasticsearch reference URL.
* @param {string=} field The field to aggregate on
*
* @extends BucketAggregationBase
*/
class TermsAggregationBase extends BucketAggregationBase {
// eslint-disable-next-line require-jsdoc
constructor(name, aggType, refUrl, field) {
super(name, aggType, field);
this._refUrl = refUrl;
}
/**
* Sets the format expression for `key_as_string` in response buckets.
* If no format is specified, then it will use the first format specified in the field mapping.
*
* @param {string} fmt Format mask to apply on aggregation response. Example: ####.00.
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
format(fmt) {
this._aggsDef.format = fmt;
return this;
}
/**
* Sets the minimum number of matching hits required to return the terms.
*
* @example
* const agg = esb.significantTermsAggregation('tags', 'tag').minDocCount(10);
*
* @param {number} minDocCnt Integer value for minimum number of documents
* required to return bucket in response
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
minDocCount(minDocCnt) {
this._aggsDef.min_doc_count = minDocCnt;
return this;
}
/**
* Sets the parameter which regulates the _certainty_ a shard has if the term
* should actually be added to the candidate list or not with respect to
* the `min_doc_count`.
* Terms will only be considered if their local shard frequency within
* the set is higher than the `shard_min_doc_count`.
*
* @param {number} minDocCnt Sets the `shard_min_doc_count` parameter. Default is 1
* and has no effect unless you explicitly set it.
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
shardMinDocCount(minDocCnt) {
this._aggsDef.shard_min_doc_count = minDocCnt;
return this;
}
/**
* Defines how many term buckets should be returned out of the overall terms list.
*
* @example
* const agg = esb.termsAggregation('products', 'product').size(5);
*
* @param {number} size
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
size(size) {
this._aggsDef.size = size;
return this;
}
/**
* Sets the `shard_size` parameter to control the volumes of candidate terms
* produced by each shard. For the default, -1, shard_size will be automatically
* estimated based on the number of shards and the size parameter.
*
* `shard_size` cannot be smaller than size (as it doesn’t make much sense).
* When it is, elasticsearch will override it and reset it to be equal to size.
*
* @param {number} size
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
shardSize(size) {
this._aggsDef.shard_size = size;
return this;
}
/**
* Sets the missing parameter which defines how documents
* that are missing a value should be treated.
*
* @param {string} value
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
missing(value) {
this._aggsDef.missing = value;
return this;
}
/**
* Filter the values for which buckets will be created.
*
* @example
* const agg = esb.termsAggregation('tags', 'tags')
* .include('.*sport.*')
* .exclude('water_.*');
*
* @example
* // Match on exact values
* const reqBody = esb.requestBodySearch()
* .agg(
* esb.termsAggregation('JapaneseCars', 'make').include([
* 'mazda',
* 'honda'
* ])
* )
* .agg(
* esb.termsAggregation('ActiveCarManufacturers', 'make').exclude([
* 'rover',
* 'jensen'
* ])
* );
*
* @param {RegExp|Array|string} clause Determine what values are "allowed" to be aggregated
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
include(clause) {
this._aggsDef.include = clause;
return this;
}
/**
* Filter the values for which buckets will be created.
*
* @example
* const agg = esb.termsAggregation('tags', 'tags')
* .include('.*sport.*')
* .exclude('water_.*');
*
* @example
* // Match on exact values
* const reqBody = esb.requestBodySearch()
* .agg(
* esb.termsAggregation('JapaneseCars', 'make').include([
* 'mazda',
* 'honda'
* ])
* )
* .agg(
* esb.termsAggregation('ActiveCarManufacturers', 'make').exclude([
* 'rover',
* 'jensen'
* ])
* );
*
* @param {RegExp|Array|string} clause Determine the values that should not be aggregated
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
*/
exclude(clause) {
this._aggsDef.exclude = clause;
return this;
}
/**
* This setting can influence the management of the values used
* for de-duplication. Each option will hold up to shard_size
* values in memory while performing de-duplication but
* the type of value held can be controlled
*
* @example
* const agg = esb.significantTermsAggregation('tags', 'tag').executionHint('map');
*
* @example
* const agg = esb.termsAggregation('tags', 'tags').executionHint('map');
*
* @param {string} hint the possible values are `map`, `global_ordinals`,
* `global_ordinals_hash` and `global_ordinals_low_cardinality`
* @returns {TermsAggregationBase} returns `this` so that calls can be chained
* @throws {Error} If Execution Hint is outside the accepted set.
*/
executionHint(hint) {
if (isNil(hint)) invalidExecutionHintParam(hint, this._refUrl);
const hintLower = hint.toLowerCase();
if (!EXECUTION_HINT_SET.has(hintLower)) {
invalidExecutionHintParam(hint, this._refUrl);
}
this._aggsDef.execution_hint = hint;
return this;
}
}
module.exports = TermsAggregationBase;