UNPKG

elastic-builder

Version:

A JavaScript implementation of the elasticsearch Query DSL

359 lines (300 loc) 12.2 kB
'use strict'; var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var MetricsAggregationBase = require('./metrics-aggregation-base'), _require = require('../../core'), Highlight = _require.Highlight, Sort = _require.Sort, _require$util = _require.util, checkType = _require$util.checkType, setDefault = _require$util.setDefault; var ES_REF_URL = 'https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html'; /** * A `top_hits` metric aggregator keeps track of the most relevant document being * aggregated. This aggregator is intended to be used as a sub aggregator, so that * the top matching documents can be aggregated per bucket. * * [Elasticsearch reference](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html) * * `top_hits` metric aggregator keeps track of the most relevant document being * aggregated. * * @example * const reqBody = esb.requestBodySearch() * .agg( * esb.termsAggregation('top_tags', 'type') * .size(3) * .agg( * esb.topHitsAggregation('top_sales_hits') * .sort(esb.sort('date', 'desc')) * .source({ includes: ['date', 'price'] }) * .size(1) * ) * ) * .size(0); * * @example * // Field collapsing(logically groups a result set into * // groups and per group returns top documents) * const reqBody = esb.requestBodySearch() * .query(esb.matchQuery('body', 'elections')) * .agg( * esb.termsAggregation('top-sites', 'domain') * .order('top_hit', 'desc') * .agg(esb.topHitsAggregation('top_tags_hits')) * .agg( * esb.maxAggregation('top_hit').script( * esb.script('inline', '_score') * ) * ) * ); * * @param {string} name The name which will be used to refer to this aggregation. * * @extends MetricsAggregationBase */ var TopHitsAggregation = function (_MetricsAggregationBa) { (0, _inherits3.default)(TopHitsAggregation, _MetricsAggregationBa); // eslint-disable-next-line require-jsdoc function TopHitsAggregation(name) { (0, _classCallCheck3.default)(this, TopHitsAggregation); return (0, _possibleConstructorReturn3.default)(this, (TopHitsAggregation.__proto__ || Object.getPrototypeOf(TopHitsAggregation)).call(this, name, 'top_hits')); } /** * @override * @throws {Error} This method cannot be called on TopHitsAggregation */ (0, _createClass3.default)(TopHitsAggregation, [{ key: 'field', value: function field() { console.log('Please refer ' + ES_REF_URL); throw new Error('field is not supported in TopHitsAggregation'); } /** * @override * @throws {Error} This method cannot be called on TopHitsAggregation */ }, { key: 'script', value: function script() { console.log('Please refer ' + ES_REF_URL); throw new Error('script is not supported in TopHitsAggregation'); } /** * @override * @throws {Error} This method cannot be called on TopHitsAggregation */ }, { key: 'missing', value: function missing() { console.log('Please refer ' + ES_REF_URL); throw new Error('missing is not supported in TopHitsAggregation'); } /** * @override * @throws {Error} This method cannot be called on TopHitsAggregation */ }, { key: 'format', value: function format() { console.log('Please refer ' + ES_REF_URL); throw new Error('format is not supported in TopHitsAggregation'); } /** * Sets the offset for fetching result. * * @param {number} from The offset from the first result you want to fetch. * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'from', value: function from(_from) { this._aggsDef.from = _from; return this; } /** * Sets the maximum number of top matching hits to return per bucket. * * @param {number} size The numer of aggregation entries to be returned per bucket. * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'size', value: function size(_size) { this._aggsDef.size = _size; return this; } /** * How the top matching hits should be sorted. Allows to add sort on specific field. * The sort can be reversed as well. The sort is defined on a per field level, * with special field name for `_score` to sort by score, and `_doc` to sort by * index order. * * @param {Sort} sort How the top matching hits should be sorted. * @returns {TopHitsAggregation} returns `this` so that calls can be chained. * @throws {TypeError} If parameter `sort` is not an instance of `Sort`. */ }, { key: 'sort', value: function sort(_sort) { checkType(_sort, Sort); setDefault(this._aggsDef, 'sort', []); this._aggsDef.sort.push(_sort); return this; } /** * Allows to add multiple sort on specific fields. Each sort can be reversed as well. * The sort is defined on a per field level, with special field name for _score to * sort by score, and _doc to sort by index order. * * @param {Array<Sort>} sorts Arry of sort How the top matching hits should be sorted. * @returns {TopHitsAggregation} returns `this` so that calls can be chained. * @throws {TypeError} If any item in parameter `sorts` is not an instance of `Sort`. */ }, { key: 'sorts', value: function sorts(_sorts) { var _this2 = this; _sorts.forEach(function (sort) { return _this2.sort(sort); }); return this; } /** * Enables score computation and tracking during sorting. * By default, sorting scores are not computed. * * @param {boolean} trackScores If scores should be computed and tracked. Defaults to false. * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'trackScores', value: function trackScores(_trackScores) { this._aggsDef.track_scores = _trackScores; return this; } /** * Enable/Disable returning version number for each hit. * * @param {boolean} version true to enable, false to disable * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'version', value: function version(_version) { this._aggsDef.version = _version; return this; } /** * Enable/Disable explanation of score for each hit. * * @param {boolean} explain true to enable, false to disable * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'explain', value: function explain(_explain) { this._aggsDef.explain = _explain; return this; } /** * Performs highlighting based on the `Highlight` settings. * * @param {Highlight} highlight * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'highlight', value: function highlight(_highlight) { checkType(_highlight, Highlight); this._aggsDef.highlight = _highlight; return this; } /** * Allows to control how the `_source` field is returned with every hit. * You can turn off `_source` retrieval by passing `false`. * It also accepts one(string) or more wildcard(array) patterns to control * what parts of the `_source` should be returned * An object can also be used to specify the wildcard patterns for `includes` and `excludes`. * * @param {boolean|string|Array|Object} source * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'source', value: function source(_source) { this._aggsDef._source = _source; return this; } /** * The stored_fields parameter is about fields that are explicitly marked as stored in the mapping. * Selectively load specific stored fields for each document represented by a search hit * using array of stored fields. * An empty array will cause only the _id and _type for each hit to be returned. * To disable the stored fields (and metadata fields) entirely use: '_none_' * * @param {Array|string} fields * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'storedFields', value: function storedFields(fields) { this._aggsDef.stored_fields = fields; return this; } /** * Computes a document property dynamically based on the supplied `Script`. * * @param {string} scriptFieldName * @param {string|Script} script string or instance of `Script` * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'scriptField', value: function scriptField(scriptFieldName, script) { setDefault(this._aggsDef, 'script_fields', {}); this._aggsDef.script_fields[scriptFieldName] = { script: script }; return this; } /** * Sets given dynamic document properties to be computed using supplied `Script`s. * * Object should have `scriptFieldName` as key and `script` as the value. * * @param {Object} scriptFields Object with `scriptFieldName` as key and `script` as the value. * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'scriptFields', value: function scriptFields(_scriptFields) { var _this3 = this; checkType(_scriptFields, Object); Object.keys(_scriptFields).forEach(function (scriptFieldName) { return _this3.scriptField(scriptFieldName, _scriptFields[scriptFieldName]); }); return this; } /** * Allows to return the doc value representation of a field for each hit. * Doc value fields can work on fields that are not stored. * * @param {Array<string>} fields * @returns {TopHitsAggregation} returns `this` so that calls can be chained */ }, { key: 'docvalueFields', value: function docvalueFields(fields) { this._aggsDef.docvalue_fields = fields; return this; } }]); return TopHitsAggregation; }(MetricsAggregationBase); module.exports = TopHitsAggregation;