diff --git a/src/plugins/data/common/es_query/es_query/filter_matches_index.ts b/src/plugins/data/common/es_query/es_query/filter_matches_index.ts index b376436756092..f77a029b6bdd5 100644 --- a/src/plugins/data/common/es_query/es_query/filter_matches_index.ts +++ b/src/plugins/data/common/es_query/es_query/filter_matches_index.ts @@ -6,9 +6,8 @@ * Side Public License, v 1. */ -import { IFieldType } from '../../index_patterns'; import { Filter } from '../filters'; -import { IndexPatternBase } from './types'; +import { FieldBase, IndexPatternBase } from './types'; /* * TODO: We should base this on something better than `filter.meta.key`. We should probably modify @@ -26,5 +25,5 @@ export function filterMatchesIndex(filter: Filter, indexPattern?: IndexPatternBa return filter.meta.index === indexPattern.id; } - return indexPattern.fields.some((field: IFieldType) => field.name === filter.meta.key); + return indexPattern.fields.some((field) => field.name === filter.meta.key); } diff --git a/src/plugins/data/common/es_query/es_query/handle_nested_filter.test.ts b/src/plugins/data/common/es_query/es_query/handle_nested_filter.test.ts index d312d034df564..bc0df315340fe 100644 --- a/src/plugins/data/common/es_query/es_query/handle_nested_filter.test.ts +++ b/src/plugins/data/common/es_query/es_query/handle_nested_filter.test.ts @@ -9,8 +9,7 @@ import { handleNestedFilter } from './handle_nested_filter'; import { fields } from '../../index_patterns/mocks'; import { buildPhraseFilter, buildQueryFilter } from '../filters'; -import { IndexPatternBase } from './types'; -import { IFieldType } from '../../index_patterns'; +import { IndexPatternBase, FieldBase } from './types'; describe('handleNestedFilter', function () { const indexPattern: IndexPatternBase = { @@ -46,7 +45,7 @@ describe('handleNestedFilter', function () { it('should return filter untouched if it does not target a field from the given index pattern', () => { const field = { ...getField('extension'), name: 'notarealfield' }; - const filter = buildPhraseFilter(field as IFieldType, 'jpg', indexPattern); + const filter = buildPhraseFilter(field, 'jpg', indexPattern); const result = handleNestedFilter(filter, indexPattern); expect(result).toBe(filter); }); diff --git a/src/plugins/data/common/es_query/es_query/index.ts b/src/plugins/data/common/es_query/es_query/index.ts index c10ea5846ae3f..efe645f111b6a 100644 --- a/src/plugins/data/common/es_query/es_query/index.ts +++ b/src/plugins/data/common/es_query/es_query/index.ts @@ -11,4 +11,4 @@ export { buildQueryFromFilters } from './from_filters'; export { luceneStringToDsl } from './lucene_string_to_dsl'; export { decorateQuery } from './decorate_query'; export { getEsQueryConfig } from './get_es_query_config'; -export { IndexPatternBase } from './types'; +export { IndexPatternBase, FieldBase, IFieldSubType } from './types'; diff --git a/src/plugins/data/common/es_query/es_query/types.ts b/src/plugins/data/common/es_query/es_query/types.ts index 2133736516049..29d5b4dad6a61 100644 --- a/src/plugins/data/common/es_query/es_query/types.ts +++ b/src/plugins/data/common/es_query/es_query/types.ts @@ -6,9 +6,29 @@ * Side Public License, v 1. */ -import { IFieldType } from '../../index_patterns'; +import type { estypes } from '@elastic/elasticsearch'; + +export interface IFieldSubType { + multi?: { parent: string }; + nested?: { path: string }; +} +export interface FieldBase { + name: string; + type: string; + subType?: IFieldSubType; + /** + * Scripted field painless script + */ + script?: string; + /** + * Scripted field langauge + * Painless is the only valid scripted field language + */ + lang?: estypes.ScriptLanguage; + scripted?: boolean; +} export interface IndexPatternBase { - fields: IFieldType[]; + fields: FieldBase[]; id?: string; } diff --git a/src/plugins/data/common/es_query/filters/build_filters.ts b/src/plugins/data/common/es_query/filters/build_filters.ts index 369f9530fb92b..333bca779af44 100644 --- a/src/plugins/data/common/es_query/filters/build_filters.ts +++ b/src/plugins/data/common/es_query/filters/build_filters.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { IFieldType, IndexPatternBase } from '../..'; +import { FieldBase, IndexPatternBase } from '../..'; + import { Filter, FILTERS, @@ -20,7 +21,7 @@ import { export function buildFilter( indexPattern: IndexPatternBase, - field: IFieldType, + field: FieldBase, type: FILTERS, negate: boolean, disabled: boolean, @@ -60,7 +61,7 @@ export function buildCustomFilter( function buildBaseFilter( indexPattern: IndexPatternBase, - field: IFieldType, + field: FieldBase, type: FILTERS, params: any ): Filter { diff --git a/src/plugins/data/common/es_query/filters/exists_filter.ts b/src/plugins/data/common/es_query/filters/exists_filter.ts index 4836950c3bb27..f5ffb85490bc2 100644 --- a/src/plugins/data/common/es_query/filters/exists_filter.ts +++ b/src/plugins/data/common/es_query/filters/exists_filter.ts @@ -7,7 +7,7 @@ */ import { Filter, FilterMeta } from './meta_filter'; -import { IFieldType } from '../../index_patterns'; +import { FieldBase } from '../../index_patterns'; import { IndexPatternBase } from '..'; export type ExistsFilterMeta = FilterMeta; @@ -27,7 +27,7 @@ export const getExistsFilterField = (filter: ExistsFilter) => { return filter.exists && filter.exists.field; }; -export const buildExistsFilter = (field: IFieldType, indexPattern: IndexPatternBase) => { +export const buildExistsFilter = (field: FieldBase, indexPattern: IndexPatternBase) => { return { meta: { index: indexPattern.id, diff --git a/src/plugins/data/common/es_query/filters/phrase_filter.ts b/src/plugins/data/common/es_query/filters/phrase_filter.ts index 27c1e85562097..7433d1eb7a2cf 100644 --- a/src/plugins/data/common/es_query/filters/phrase_filter.ts +++ b/src/plugins/data/common/es_query/filters/phrase_filter.ts @@ -8,7 +8,7 @@ import type { estypes } from '@elastic/elasticsearch'; import { get, isPlainObject } from 'lodash'; import { Filter, FilterMeta } from './meta_filter'; -import { IFieldType } from '../../index_patterns'; +import { FieldBase } from '../../index_patterns'; import { IndexPatternBase } from '..'; export type PhraseFilterMeta = FilterMeta & { @@ -59,7 +59,7 @@ export const getPhraseFilterValue = (filter: PhraseFilter): PhraseFilterValue => }; export const buildPhraseFilter = ( - field: IFieldType, + field: FieldBase, value: any, indexPattern: IndexPatternBase ): PhraseFilter => { @@ -82,7 +82,7 @@ export const buildPhraseFilter = ( } }; -export const getPhraseScript = (field: IFieldType, value: string) => { +export const getPhraseScript = (field: FieldBase, value: string) => { const convertedValue = getConvertedValueForField(field, value); const script = buildInlineScriptForPhraseFilter(field); @@ -106,7 +106,7 @@ export const getPhraseScript = (field: IFieldType, value: string) => { * https://github.com/elastic/elasticsearch/issues/20941 * https://github.com/elastic/elasticsearch/pull/22201 **/ -export const getConvertedValueForField = (field: IFieldType, value: any) => { +export const getConvertedValueForField = (field: FieldBase, value: any) => { if (typeof value !== 'boolean' && field.type === 'boolean') { if ([1, 'true'].includes(value)) { return true; diff --git a/src/plugins/data/common/es_query/filters/phrases_filter.ts b/src/plugins/data/common/es_query/filters/phrases_filter.ts index 2694461fc1930..e73f0f4e6a810 100644 --- a/src/plugins/data/common/es_query/filters/phrases_filter.ts +++ b/src/plugins/data/common/es_query/filters/phrases_filter.ts @@ -9,8 +9,7 @@ import { Filter, FilterMeta } from './meta_filter'; import { getPhraseScript } from './phrase_filter'; import { FILTERS } from './index'; -import { IFieldType } from '../../index_patterns'; -import { IndexPatternBase } from '../es_query'; +import { FieldBase, IndexPatternBase } from '../es_query'; export type PhrasesFilterMeta = FilterMeta & { params: string[]; // The unformatted values @@ -33,7 +32,7 @@ export const getPhrasesFilterField = (filter: PhrasesFilter) => { // Creates a filter where the given field matches one or more of the given values // params should be an array of values export const buildPhrasesFilter = ( - field: IFieldType, + field: FieldBase, params: any[], indexPattern: IndexPatternBase ) => { diff --git a/src/plugins/data/common/es_query/filters/range_filter.test.ts b/src/plugins/data/common/es_query/filters/range_filter.test.ts index bb7ecc09ebc34..613f987a76800 100644 --- a/src/plugins/data/common/es_query/filters/range_filter.test.ts +++ b/src/plugins/data/common/es_query/filters/range_filter.test.ts @@ -9,15 +9,15 @@ import { each } from 'lodash'; import { buildRangeFilter, getRangeFilterField, RangeFilter } from './range_filter'; import { fields, getField } from '../../index_patterns/mocks'; -import { IIndexPattern, IFieldType } from '../../index_patterns'; +import { IndexPatternBase, FieldBase } from '../es_query'; describe('Range filter builder', () => { - let indexPattern: IIndexPattern; + let indexPattern: IndexPatternBase; beforeEach(() => { indexPattern = { id: 'id', - } as IIndexPattern; + } as IndexPatternBase; }); it('should be a function', () => { @@ -130,7 +130,7 @@ describe('Range filter builder', () => { }); describe('when given params where one side is infinite', () => { - let field: IFieldType; + let field: FieldBase; let filter: RangeFilter; beforeEach(() => { @@ -160,7 +160,7 @@ describe('Range filter builder', () => { }); describe('when given params where both sides are infinite', () => { - let field: IFieldType; + let field: FieldBase; let filter: RangeFilter; beforeEach(() => { @@ -186,9 +186,9 @@ describe('Range filter builder', () => { }); describe('getRangeFilterField', function () { - const indexPattern: IIndexPattern = ({ + const indexPattern: IndexPatternBase = ({ fields, - } as unknown) as IIndexPattern; + } as unknown) as IndexPatternBase; test('should return the name of the field a range query is targeting', () => { const field = indexPattern.fields.find((patternField) => patternField.name === 'bytes'); diff --git a/src/plugins/data/common/es_query/filters/range_filter.ts b/src/plugins/data/common/es_query/filters/range_filter.ts index 9f1d9a5d08926..4b0fc10d90ff6 100644 --- a/src/plugins/data/common/es_query/filters/range_filter.ts +++ b/src/plugins/data/common/es_query/filters/range_filter.ts @@ -8,8 +8,7 @@ import type { estypes } from '@elastic/elasticsearch'; import { map, reduce, mapValues, get, keys, pickBy } from 'lodash'; import { Filter, FilterMeta } from './meta_filter'; -import { IFieldType } from '../../index_patterns'; -import { IndexPatternBase } from '..'; +import { IndexPatternBase, FieldBase } from '..'; const OPERANDS_IN_RANGE = 2; @@ -83,13 +82,13 @@ export const getRangeFilterField = (filter: RangeFilter) => { return filter.range && Object.keys(filter.range)[0]; }; -const formatValue = (field: IFieldType, params: any[]) => +const formatValue = (field: FieldBase, params: any[]) => map(params, (val: any, key: string) => get(operators, key) + val).join(' '); // Creates a filter where the value for the given field is in the given range // params should be an object containing `lt`, `lte`, `gt`, and/or `gte` export const buildRangeFilter = ( - field: IFieldType, + field: FieldBase, params: RangeFilterParams, indexPattern: IndexPatternBase, formattedValue?: string @@ -135,7 +134,7 @@ export const buildRangeFilter = ( return filter as RangeFilter; }; -export const getRangeScript = (field: IFieldType, params: RangeFilterParams) => { +export const getRangeScript = (field: FieldBase, params: RangeFilterParams) => { const knownParams = mapValues( pickBy(params, (val, key: any) => key in operators), (value) => (field.type === 'number' && typeof value === 'string' ? parseFloat(value) : value) diff --git a/src/plugins/data/common/es_query/kuery/functions/exists.ts b/src/plugins/data/common/es_query/kuery/functions/exists.ts index fa6c37e6ba18f..17db93ae68d26 100644 --- a/src/plugins/data/common/es_query/kuery/functions/exists.ts +++ b/src/plugins/data/common/es_query/kuery/functions/exists.ts @@ -8,7 +8,7 @@ import { get } from 'lodash'; import * as literal from '../node_types/literal'; -import { KueryNode, IFieldType, IndexPatternBase } from '../../..'; +import { KueryNode, FieldBase, IndexPatternBase } from '../../..'; export function buildNodeParams(fieldName: string) { return { @@ -30,9 +30,9 @@ export function toElasticsearchQuery( value: context?.nested ? `${context.nested.path}.${fieldNameArg.value}` : fieldNameArg.value, }; const fieldName = literal.toElasticsearchQuery(fullFieldNameArg); - const field = get(indexPattern, 'fields', []).find((fld: IFieldType) => fld.name === fieldName); + const field = indexPattern?.fields?.find((fld: FieldBase) => fld.name === fieldName); - if (field && (field as IFieldType).scripted) { + if (field?.scripted) { throw new Error(`Exists query does not support scripted fields`); } return { diff --git a/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.ts b/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.ts index 38a433b1b80ab..60211f3f67863 100644 --- a/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.ts +++ b/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.ts @@ -9,7 +9,7 @@ import _ from 'lodash'; import { nodeTypes } from '../node_types'; import * as ast from '../ast'; -import { IndexPatternBase, KueryNode, IFieldType, LatLon } from '../../..'; +import { IndexPatternBase, KueryNode, FieldBase, LatLon } from '../../..'; export function buildNodeParams(fieldName: string, params: any) { params = _.pick(params, 'topLeft', 'bottomRight'); @@ -36,8 +36,8 @@ export function toElasticsearchQuery( value: context?.nested ? `${context.nested.path}.${fieldNameArg.value}` : fieldNameArg.value, }; const fieldName = nodeTypes.literal.toElasticsearchQuery(fullFieldNameArg) as string; - const fieldList: IFieldType[] = indexPattern?.fields ?? []; - const field = fieldList.find((fld: IFieldType) => fld.name === fieldName); + const fieldList = indexPattern?.fields ?? []; + const field = fieldList.find((fld) => fld.name === fieldName); const queryParams = args.reduce((acc: any, arg: any) => { const snakeArgName = _.snakeCase(arg.name); diff --git a/src/plugins/data/common/es_query/kuery/functions/geo_polygon.ts b/src/plugins/data/common/es_query/kuery/functions/geo_polygon.ts index 69de7248a7b38..b437baf37988e 100644 --- a/src/plugins/data/common/es_query/kuery/functions/geo_polygon.ts +++ b/src/plugins/data/common/es_query/kuery/functions/geo_polygon.ts @@ -8,7 +8,7 @@ import { nodeTypes } from '../node_types'; import * as ast from '../ast'; -import { IndexPatternBase, KueryNode, IFieldType, LatLon } from '../../..'; +import { IndexPatternBase, KueryNode, FieldBase, LatLon } from '../../..'; import { LiteralTypeBuildNode } from '../node_types/types'; export function buildNodeParams(fieldName: string, points: LatLon[]) { @@ -35,8 +35,8 @@ export function toElasticsearchQuery( value: context?.nested ? `${context.nested.path}.${fieldNameArg.value}` : fieldNameArg.value, }; const fieldName = nodeTypes.literal.toElasticsearchQuery(fullFieldNameArg) as string; - const fieldList: IFieldType[] = indexPattern?.fields ?? []; - const field = fieldList.find((fld: IFieldType) => fld.name === fieldName); + const fieldList = indexPattern?.fields ?? []; + const field = fieldList.find((fld) => fld.name === fieldName); const queryParams = { points: points.map((point: LiteralTypeBuildNode) => { return ast.toElasticsearchQuery(point, indexPattern, config, context); diff --git a/src/plugins/data/common/es_query/kuery/functions/is.ts b/src/plugins/data/common/es_query/kuery/functions/is.ts index 55d036c2156f9..47ae5bb4af0d9 100644 --- a/src/plugins/data/common/es_query/kuery/functions/is.ts +++ b/src/plugins/data/common/es_query/kuery/functions/is.ts @@ -11,7 +11,7 @@ import { getPhraseScript } from '../../filters'; import { getFields } from './utils/get_fields'; import { getTimeZoneFromSettings } from '../../utils'; import { getFullFieldNameNode } from './utils/get_full_field_name_node'; -import { IndexPatternBase, KueryNode, IFieldType } from '../../..'; +import { IndexPatternBase, KueryNode, FieldBase } from '../../..'; import * as ast from '../ast'; @@ -100,7 +100,7 @@ export function toElasticsearchQuery( return { match_all: {} }; } - const queries = fields!.reduce((accumulator: any, field: IFieldType) => { + const queries = fields!.reduce((accumulator: any, field: FieldBase) => { const wrapWithNestedQuery = (query: any) => { // Wildcards can easily include nested and non-nested fields. There isn't a good way to let // users handle this themselves so we automatically add nested queries in this scenario. diff --git a/src/plugins/data/common/es_query/kuery/functions/range.ts b/src/plugins/data/common/es_query/kuery/functions/range.ts index caefa7e5373ca..13919759f4dbb 100644 --- a/src/plugins/data/common/es_query/kuery/functions/range.ts +++ b/src/plugins/data/common/es_query/kuery/functions/range.ts @@ -13,7 +13,7 @@ import { getRangeScript, RangeFilterParams } from '../../filters'; import { getFields } from './utils/get_fields'; import { getTimeZoneFromSettings } from '../../utils'; import { getFullFieldNameNode } from './utils/get_full_field_name_node'; -import { IndexPatternBase, KueryNode, IFieldType } from '../../..'; +import { IndexPatternBase, KueryNode, FieldBase } from '../../..'; export function buildNodeParams(fieldName: string, params: RangeFilterParams) { const paramsToMap = _.pick(params, 'gt', 'lt', 'gte', 'lte', 'format'); @@ -62,7 +62,7 @@ export function toElasticsearchQuery( }); } - const queries = fields!.map((field: IFieldType) => { + const queries = fields!.map((field) => { const wrapWithNestedQuery = (query: any) => { // Wildcards can easily include nested and non-nested fields. There isn't a good way to let // users handle this themselves so we automatically add nested queries in this scenario. diff --git a/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts b/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts index 47fe677454cbf..949f94d043553 100644 --- a/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts +++ b/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts @@ -6,21 +6,21 @@ * Side Public License, v 1. */ +import { IndexPatternBase } from '../../..'; import { fields } from '../../../../index_patterns/mocks'; import { nodeTypes } from '../../index'; -import { IIndexPattern, IFieldType } from '../../../../index_patterns'; // @ts-ignore import { getFields } from './get_fields'; describe('getFields', () => { - let indexPattern: IIndexPattern; + let indexPattern: IndexPatternBase; beforeEach(() => { indexPattern = ({ fields, - } as unknown) as IIndexPattern; + } as unknown) as IndexPatternBase; }); describe('field names without a wildcard', () => { @@ -41,14 +41,14 @@ describe('getFields', () => { }); test('should not match a wildcard in a literal node', () => { - const indexPatternWithWildField = { + const indexPatternWithWildField: IndexPatternBase = ({ title: 'wildIndex', fields: [ { name: 'foo*', }, ], - } as IIndexPattern; + } as unknown) as IndexPatternBase; const fieldNameNode = nodeTypes.literal.buildNode('foo*'); const results = getFields(fieldNameNode, indexPatternWithWildField); @@ -76,8 +76,8 @@ describe('getFields', () => { expect(Array.isArray(results)).toBeTruthy(); expect(results).toHaveLength(2); - expect(results!.find((field: IFieldType) => field.name === 'machine.os')).toBeDefined(); - expect(results!.find((field: IFieldType) => field.name === 'machine.os.raw')).toBeDefined(); + expect(results!.find((field) => field.name === 'machine.os')).toBeDefined(); + expect(results!.find((field) => field.name === 'machine.os.raw')).toBeDefined(); }); }); }); diff --git a/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.ts b/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.ts index 644791637aa70..cfea79696122c 100644 --- a/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.ts +++ b/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.ts @@ -7,7 +7,7 @@ */ import { getFields } from './get_fields'; -import { IndexPatternBase, IFieldType, KueryNode } from '../../../..'; +import { IndexPatternBase, FieldBase, KueryNode } from '../../../..'; export function getFullFieldNameNode( rootNameNode: any, @@ -27,7 +27,7 @@ export function getFullFieldNameNode( } const fields = getFields(fullFieldNameNode, indexPattern); - const errors = fields!.reduce((acc: any, field: IFieldType) => { + const errors = fields!.reduce((acc: any, field: FieldBase) => { const nestedPathFromField = field.subType && field.subType.nested ? field.subType.nested.path : undefined; diff --git a/src/plugins/data/common/index_patterns/fields/types.ts b/src/plugins/data/common/index_patterns/fields/types.ts index 0fb7a46c2cf73..608294b04dc91 100644 --- a/src/plugins/data/common/index_patterns/fields/types.ts +++ b/src/plugins/data/common/index_patterns/fields/types.ts @@ -5,18 +5,13 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type { estypes } from '@elastic/elasticsearch'; -import { FieldSpec, IFieldSubType, IndexPattern } from '../..'; +import { FieldBase, FieldSpec, IndexPattern } from '../..'; /** * @deprecated * Use IndexPatternField or FieldSpec instead */ -export interface IFieldType { - name: string; - type: string; - script?: string; - lang?: estypes.ScriptLanguage; +export interface IFieldType extends FieldBase { count?: number; // esTypes might be undefined on old index patterns that have not been refreshed since we added // this prop. It is also undefined on scripted fields. @@ -27,8 +22,6 @@ export interface IFieldType { sortable?: boolean; visualizable?: boolean; readFromDocValues?: boolean; - scripted?: boolean; - subType?: IFieldSubType; displayName?: string; customLabel?: string; format?: any; diff --git a/src/plugins/data/common/index_patterns/types.ts b/src/plugins/data/common/index_patterns/types.ts index a88f029c0c7cd..4fa7531efcb74 100644 --- a/src/plugins/data/common/index_patterns/types.ts +++ b/src/plugins/data/common/index_patterns/types.ts @@ -9,7 +9,7 @@ import type { estypes } from '@elastic/elasticsearch'; import { ToastInputFields, ErrorToastOptions } from 'src/core/public/notifications'; // eslint-disable-next-line import type { SavedObject } from 'src/core/server'; -import type { IndexPatternBase } from '../es_query'; +import type { FieldBase, IFieldSubType, IndexPatternBase } from '../es_query'; import { IFieldType } from './fields'; import { RUNTIME_FIELD_TYPES } from './constants'; import { SerializedFieldFormat } from '../../../expressions/common'; @@ -149,12 +149,6 @@ export type AggregationRestrictions = Record< time_zone?: string; } >; - -export interface IFieldSubType { - multi?: { parent: string }; - nested?: { path: string }; -} - export interface TypeMeta { aggs?: Record; [key: string]: any; @@ -183,30 +177,17 @@ export interface FieldSpecExportFmt { /** * Serialized version of IndexPatternField */ -export interface FieldSpec { +export interface FieldSpec extends FieldBase { /** * Popularity count is used by discover */ count?: number; - /** - * Scripted field painless script - */ - script?: string; - /** - * Scripted field langauge - * Painless is the only valid scripted field language - */ - lang?: estypes.ScriptLanguage; conflictDescriptions?: Record; format?: SerializedFieldFormat; - name: string; - type: string; esTypes?: string[]; - scripted?: boolean; searchable: boolean; aggregatable: boolean; readFromDocValues?: boolean; - subType?: IFieldSubType; indexed?: boolean; customLabel?: string; runtimeField?: RuntimeField;