/**
 * Типы поиска
 * @enum
 */
import { BoolBuilder } from './BoolBuilder';
import { ScriptBuilder } from './ScriptBuilder';
export declare enum IFindTypes {
    MUST = "must",
    MUST_NOT = "must_not",
    SHOULD = "should"
}
/**
 * Критерии фильтрации
 * @enum
 */
export declare enum IFilterTypes {
    RANGE = "range",
    EXISTS = "exists",
    BY_ARRAY_TERMS = "terms",
    BY_TERMIN = "term",
    MATCH_PHRASE = "match_phrase",
    MATCH = "match"
}
/**
 * Критерии для поиска диапазонов
 * @interface
 */
export interface IRangeFilter {
    gt?: range;
    gte?: range;
    lt?: range;
    lte?: range;
}
/**
 * Тип для диапазонов
 * @type
 */
export declare type range = number | Date;
/**
 * Варианты сортировки
 * @enum
 */
export declare enum SortTypes {
    ASC = "asc",
    DESC = "desc"
}
/**
 * Обьект сортировки
 * @interface
 */
export interface ISortPArams {
    [field: string]: {
        order: SortTypes;
    };
}
export interface IRawQuery {
    size?: number;
    query: {
        bool: {
            must: any[];
            must_not: any[];
            should: any[];
        };
    };
}
/**
 * @Class QueryBuilder
 * @Classdesc Билдер запросов к elasticSearch
 */
export declare class QueryBuilder {
    /**
     * Хранилище запроса
     * @private
     */
    private _query;
    private _agg;
    private _script;
    /**
     * Сортировка
     * @param args
     * @return {this}
     */
    sort(...args: ISortPArams[]): this;
    /**
     * Сортировка
     * @param args[]
     * @return {this}
     */
    sortOfArray(args: ISortPArams[]): this;
    /**
     * Указать критерий поиска по индексу (термин, например articul = 10001)
     * @param type
     * @param field
     * @param value
     * @return {this}
     */
    addTerm(type: IFindTypes, field: string, value: number | Date | string | boolean): this;
    addMatch(type: IFindTypes, field: string, value: number | Date | string | boolean): this;
    /**
     * Указать набор критериев через Bool
     * @param type
     * @param bool
     * @return {this}
     */
    addBool(type: IFindTypes, bool: BoolBuilder): this;
    /**
     * Фраза для поиска
     * @param type
     * @param field
     * @param value
     * @return {this}
     */
    addTextPhrase(type: IFindTypes, field: string, value: string): this;
    /**
     * Указать массив критериев поиска (аналогия выше) по индексу
     * @param type
     * @param field
     * @param values
     * @return {this}
     */
    addTermsArray(type: IFindTypes, field: string, values: string[] | number[]): this;
    /**
     * Указать критерий поиска на существование колонки
     * @param type
     * @param fieldName
     * @return {this}
     */
    addExistsTerm(type: IFindTypes, fieldName: string): this;
    /**
     * Указать диапазон поиска по индексу
     * @param type
     * @param field
     * @param value
     * @return {this}
     */
    addRange(type: IFindTypes, field: string, value: IRangeFilter): this;
    addAggsTerms(key: string, field: string, missing?: any): this;
    addAggsMax(key: string, field: string): this;
    addAggsMaxScript(key: string, b: ScriptBuilder | string): this;
    addAggsMinScript(key: string, b: ScriptBuilder | string): this;
    addAggsMin(key: string, field: string): this;
    addFieldScript(b: ScriptBuilder | string): this;
    /**
     * Свой запрос
     * @param type
     * @param filterType
     * @param filter
     * @return {this}
     */
    addCustomFilter(type: IFindTypes, filterType: IFilterTypes, filter: any): this;
    /**
     * Вернуть запрос
     * @return {object}
     */
    buildQuery(): object;
    /**
     * Запрос для получения колличества записей
     * @return {Pick<any, Exclude<keyof any, "sort">>}
     */
    buildCountQuery(): object;
    /**
     * Получить сырой запрос
     * @return {string}
     * @private
     */
    _getPrettyQuery(): object;
    /**
     * Установить максимальный размер выборки
     */
    maxSampleSize(): this;
}
