elasticlink 0.3.0-beta → 0.4.0-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +61 -14
  2. package/dist/__tests__/aggregation-builder.test.d.ts +2 -0
  3. package/dist/__tests__/aggregation-builder.test.d.ts.map +1 -0
  4. package/dist/__tests__/aggregation-builder.test.js +622 -0
  5. package/dist/__tests__/bulk.test.d.ts +2 -0
  6. package/dist/__tests__/bulk.test.d.ts.map +1 -0
  7. package/dist/__tests__/bulk.test.js +679 -0
  8. package/dist/__tests__/examples.test.d.ts +2 -0
  9. package/dist/__tests__/examples.test.d.ts.map +1 -0
  10. package/dist/__tests__/examples.test.js +2123 -0
  11. package/dist/__tests__/fixtures/finance.d.ts +58 -0
  12. package/dist/__tests__/fixtures/finance.d.ts.map +1 -0
  13. package/dist/__tests__/fixtures/finance.js +73 -0
  14. package/dist/__tests__/fixtures/legal.d.ts +14 -0
  15. package/dist/__tests__/fixtures/legal.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/legal.js +27 -0
  17. package/dist/__tests__/fixtures/real-estate.d.ts +31 -0
  18. package/dist/__tests__/fixtures/real-estate.d.ts.map +1 -0
  19. package/dist/__tests__/fixtures/real-estate.js +39 -0
  20. package/dist/__tests__/index-management.test.d.ts +2 -0
  21. package/dist/__tests__/index-management.test.d.ts.map +1 -0
  22. package/dist/__tests__/index-management.test.js +1699 -0
  23. package/dist/__tests__/integration/aggregation.integration.test.d.ts +2 -0
  24. package/dist/__tests__/integration/aggregation.integration.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/aggregation.integration.test.js +188 -0
  26. package/dist/__tests__/integration/bulk.integration.test.d.ts +2 -0
  27. package/dist/__tests__/integration/bulk.integration.test.d.ts.map +1 -0
  28. package/dist/__tests__/integration/bulk.integration.test.js +90 -0
  29. package/dist/__tests__/integration/fixtures/finance.d.ts +37 -0
  30. package/dist/__tests__/integration/fixtures/finance.d.ts.map +1 -0
  31. package/dist/__tests__/integration/fixtures/finance.js +58 -0
  32. package/dist/__tests__/integration/fixtures/legal.d.ts +38 -0
  33. package/dist/__tests__/integration/fixtures/legal.d.ts.map +1 -0
  34. package/dist/__tests__/integration/fixtures/legal.js +65 -0
  35. package/dist/__tests__/integration/fixtures/real-estate.d.ts +17 -0
  36. package/dist/__tests__/integration/fixtures/real-estate.d.ts.map +1 -0
  37. package/dist/__tests__/integration/fixtures/real-estate.js +28 -0
  38. package/dist/__tests__/integration/helpers.d.ts +15 -0
  39. package/dist/__tests__/integration/helpers.d.ts.map +1 -0
  40. package/dist/__tests__/integration/helpers.js +21 -0
  41. package/dist/__tests__/integration/index-management.integration.test.d.ts +2 -0
  42. package/dist/__tests__/integration/index-management.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/integration/index-management.integration.test.js +67 -0
  44. package/dist/__tests__/integration/multi-search.integration.test.d.ts +2 -0
  45. package/dist/__tests__/integration/multi-search.integration.test.d.ts.map +1 -0
  46. package/dist/__tests__/integration/multi-search.integration.test.js +49 -0
  47. package/dist/__tests__/integration/query.integration.test.d.ts +2 -0
  48. package/dist/__tests__/integration/query.integration.test.d.ts.map +1 -0
  49. package/dist/__tests__/integration/query.integration.test.js +101 -0
  50. package/dist/__tests__/integration/suggester.integration.test.d.ts +2 -0
  51. package/dist/__tests__/integration/suggester.integration.test.d.ts.map +1 -0
  52. package/dist/__tests__/integration/suggester.integration.test.js +42 -0
  53. package/dist/__tests__/multi-search.test.d.ts +2 -0
  54. package/dist/__tests__/multi-search.test.d.ts.map +1 -0
  55. package/dist/__tests__/multi-search.test.js +325 -0
  56. package/dist/__tests__/query-builder-extensions.test.d.ts +2 -0
  57. package/dist/__tests__/query-builder-extensions.test.d.ts.map +1 -0
  58. package/dist/__tests__/query-builder-extensions.test.js +436 -0
  59. package/dist/__tests__/query-builder.test.d.ts +2 -0
  60. package/dist/__tests__/query-builder.test.d.ts.map +1 -0
  61. package/dist/__tests__/query-builder.test.js +5482 -0
  62. package/dist/__tests__/settings-presets.test.d.ts +2 -0
  63. package/dist/__tests__/settings-presets.test.d.ts.map +1 -0
  64. package/dist/__tests__/settings-presets.test.js +183 -0
  65. package/dist/__tests__/suggester.test.d.ts +2 -0
  66. package/dist/__tests__/suggester.test.d.ts.map +1 -0
  67. package/dist/__tests__/suggester.test.js +1006 -0
  68. package/dist/aggregation.builder.d.ts.map +1 -1
  69. package/dist/aggregation.builder.js +101 -94
  70. package/dist/aggregation.types.d.ts +10 -9
  71. package/dist/aggregation.types.d.ts.map +1 -1
  72. package/dist/bulk.builder.d.ts +11 -1
  73. package/dist/bulk.builder.d.ts.map +1 -1
  74. package/dist/bulk.builder.js +10 -11
  75. package/dist/bulk.types.d.ts.map +1 -1
  76. package/dist/field.helpers.d.ts +59 -4
  77. package/dist/field.helpers.d.ts.map +1 -1
  78. package/dist/field.helpers.js +87 -4
  79. package/dist/field.types.d.ts +78 -1
  80. package/dist/field.types.d.ts.map +1 -1
  81. package/dist/index-management.builder.d.ts +15 -3
  82. package/dist/index-management.builder.d.ts.map +1 -1
  83. package/dist/index-management.builder.js +32 -8
  84. package/dist/index-management.types.d.ts +27 -3
  85. package/dist/index-management.types.d.ts.map +1 -1
  86. package/dist/index.d.ts +3 -2
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +3 -1
  89. package/dist/mapping.builder.d.ts +16 -3
  90. package/dist/mapping.builder.d.ts.map +1 -1
  91. package/dist/mapping.builder.js +22 -7
  92. package/dist/mapping.types.d.ts +29 -6
  93. package/dist/mapping.types.d.ts.map +1 -1
  94. package/dist/multi-search.builder.d.ts +1 -1
  95. package/dist/multi-search.builder.d.ts.map +1 -1
  96. package/dist/multi-search.builder.js +5 -3
  97. package/dist/query.builder.d.ts +0 -4
  98. package/dist/query.builder.d.ts.map +1 -1
  99. package/dist/query.builder.js +104 -183
  100. package/dist/query.types.d.ts +59 -5
  101. package/dist/query.types.d.ts.map +1 -1
  102. package/dist/settings.presets.d.ts +98 -0
  103. package/dist/settings.presets.d.ts.map +1 -0
  104. package/dist/settings.presets.js +115 -0
  105. package/dist/suggester.builder.d.ts.map +1 -1
  106. package/dist/suggester.builder.js +1 -0
  107. package/dist/suggester.types.d.ts.map +1 -1
  108. package/dist/vector.types.d.ts.map +1 -1
  109. package/package.json +6 -3
@@ -3,14 +3,34 @@
3
3
  * MappingsSchema carries both runtime ES properties and a phantom type M
4
4
  * that maps field names to their ES type literals.
5
5
  */
6
- import type { FieldMapping, FieldTypeString } from './index-management.types.js';
7
- export type MappingsSchema<M extends Record<string, FieldTypeString>> = {
8
- readonly _fieldTypes: M;
9
- readonly properties: Record<string, FieldMapping>;
6
+ import type { FieldMapping, FieldTypeString, SourceConfig } from './index-management.types.js';
7
+ /**
8
+ * Options for `mappings()`.
9
+ *
10
+ * @param dynamic - Controls how unmapped fields are handled. Defaults to `'strict'`
11
+ * to prevent unmapped fields from being silently indexed. Set to `true` to allow
12
+ * dynamic mapping, or `'runtime'` for runtime fields.
13
+ * @param _source - Configure which fields are stored in `_source`.
14
+ * Use `{ excludes: ['embedding'] }` to prune large dense_vector fields from
15
+ * returned `_source` — they remain searchable via kNN but won't bloat query responses.
16
+ * @param _meta - Custom metadata to attach to the mapping.
17
+ */
18
+ export type MappingOptions = {
19
+ dynamic?: boolean | 'strict' | 'runtime';
20
+ _source?: SourceConfig;
21
+ _meta?: Record<string, unknown>;
10
22
  };
23
+ export type MappingsSchema<M extends Record<string, FieldTypeString>> = Readonly<{
24
+ _fieldTypes: M;
25
+ properties: Record<string, FieldMapping>;
26
+ _mappingOptions?: MappingOptions;
27
+ }>;
11
28
  type ESTypeToTS = {
12
29
  text: string;
30
+ match_only_text: string;
13
31
  keyword: string;
32
+ constant_keyword: string;
33
+ wildcard: string;
14
34
  long: number;
15
35
  integer: number;
16
36
  short: number;
@@ -30,8 +50,10 @@ type ESTypeToTS = {
30
50
  geo_shape: Record<string, unknown>;
31
51
  dense_vector: number[];
32
52
  completion: string;
53
+ search_as_you_type: string;
33
54
  nested: unknown;
34
55
  object: unknown;
56
+ flattened: Record<string, unknown>;
35
57
  alias: unknown;
36
58
  percolator: unknown;
37
59
  integer_range: {
@@ -71,12 +93,13 @@ export type Infer<S> = S extends MappingsSchema<infer M> ? {
71
93
  export type FieldsOfType<M extends Record<string, FieldTypeString>, Types extends FieldTypeString> = {
72
94
  [K in keyof M]: M[K] extends Types ? K : never;
73
95
  }[keyof M];
74
- export type TextFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'text'>;
75
- export type KeywordFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'keyword'>;
96
+ export type TextFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'text' | 'match_only_text' | 'search_as_you_type'>;
97
+ export type KeywordFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'keyword' | 'constant_keyword' | 'wildcard'>;
76
98
  export type NumericFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'long' | 'integer' | 'short' | 'byte' | 'double' | 'float' | 'half_float' | 'scaled_float'>;
77
99
  export type DateFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'date'>;
78
100
  export type BooleanFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'boolean'>;
79
101
  export type GeoPointFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'geo_point'>;
80
102
  export type VectorFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'dense_vector'>;
103
+ export type IpFields<M extends Record<string, FieldTypeString>> = FieldsOfType<M, 'ip'>;
81
104
  export {};
82
105
  //# sourceMappingURL=mapping.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapping.types.d.ts","sourceRoot":"","sources":["../src/mapping.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapping.types.d.ts","sourceRoot":"","sources":["../src/mapping.types.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ export declare const createMSearchBuilder: <M extends Record<string, FieldTypeSt
13
13
  /**
14
14
  * Create a new multi-search builder
15
15
  * @example
16
- * const ms = msearch<typeof productMappings._fieldTypes>()
16
+ * const ms = msearch(productMappings)
17
17
  * .addQuery(query1.build(), { index: 'products' })
18
18
  * .addQuery(query2.build(), { index: 'products' })
19
19
  * .build();
@@ -1 +1 @@
1
- {"version":3,"file":"multi-search.builder.d.ts","sourceRoot":"","sources":["../src/multi-search.builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC5E,WAAU,cAAc,CAAC,CAAC,CAAC,EAAO,KACjC,cAAc,CAAC,CAAC,CAwBjB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC/D,SAAS,cAAc,CAAC,CAAC,CAAC,sBACE,CAAC"}
1
+ {"version":3,"file":"multi-search.builder.d.ts","sourceRoot":"","sources":["../src/multi-search.builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC5E,WAAU,cAAc,CAAC,CAAC,CAAC,EAAO,KACjC,cAAc,CAAC,CAAC,CAwBjB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,sBAClE,CAAC"}
@@ -13,15 +13,17 @@ export const createMSearchBuilder = (searches = []) => ({
13
13
  addQuery: (body, header = {}) => {
14
14
  return createMSearchBuilder([...searches, { header, body }]);
15
15
  },
16
+ // eslint-disable-next-line functional/functional-parameters
16
17
  build: () => {
17
- return (searches
18
+ return `${searches
18
19
  .map(({ header, body }) => {
19
20
  const headerLine = JSON.stringify(header || {});
20
21
  const bodyLine = JSON.stringify(body);
21
22
  return `${headerLine}\n${bodyLine}`;
22
23
  })
23
- .join('\n') + '\n');
24
+ .join('\n')}\n`;
24
25
  },
26
+ // eslint-disable-next-line functional/functional-parameters
25
27
  buildArray: () => {
26
28
  return searches.flatMap(({ header, body }) => [header || {}, body]);
27
29
  }
@@ -29,7 +31,7 @@ export const createMSearchBuilder = (searches = []) => ({
29
31
  /**
30
32
  * Create a new multi-search builder
31
33
  * @example
32
- * const ms = msearch<typeof productMappings._fieldTypes>()
34
+ * const ms = msearch(productMappings)
33
35
  * .addQuery(query1.build(), { index: 'products' })
34
36
  * .addQuery(query2.build(), { index: 'products' })
35
37
  * .build();
@@ -1,7 +1,3 @@
1
- /**
2
- * Query builder implementation
3
- * Builds type-safe Elasticsearch queries with a fluent API
4
- */
5
1
  import type { FieldTypeString } from './index-management.types.js';
6
2
  import type { QueryState, QueryBuilder } from './query.types.js';
7
3
  export declare const createQueryBuilder: <M extends Record<string, FieldTypeString>>(state?: QueryState<M>) => QueryBuilder<M>;
@@ -1 +1 @@
1
- {"version":3,"file":"query.builder.d.ts","sourceRoot":"","sources":["../src/query.builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AAuEhF,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1E,QAAO,UAAU,CAAC,CAAC,CAAM,KACxB,YAAY,CAAC,CAAC,CA4Sf,CAAC"}
1
+ {"version":3,"file":"query.builder.d.ts","sourceRoot":"","sources":["../src/query.builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AA6EhF,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1E,QAAO,UAAU,CAAC,CAAC,CAAM,KACxB,YAAY,CAAC,CAAC,CAyMf,CAAC"}
@@ -1,81 +1,73 @@
1
- /**
2
- * Query builder implementation
3
- * Builds type-safe Elasticsearch queries with a fluent API
4
- */
5
1
  import { createAggregationBuilder } from './aggregation.builder.js';
6
2
  import { createSuggesterBuilder } from './suggester.builder.js';
7
- const createClauseBuilder = () => ({
8
- matchAll: () => ({ match_all: {} }),
9
- match: (field, value, options) => {
10
- if (!options || Object.keys(options).length === 0) {
11
- return { match: { [field]: value } };
12
- }
13
- return { match: { [field]: { query: value, ...options } } };
14
- },
15
- multiMatch: (fields, query, options) => {
16
- if (!options || Object.keys(options).length === 0) {
17
- return { multi_match: { fields, query } };
18
- }
19
- return { multi_match: { fields, query, ...options } };
20
- },
21
- matchPhrase: (field, query) => ({ match_phrase: { [field]: query } }),
22
- matchPhrasePrefix: (field, value, options) => {
23
- if (!options || Object.keys(options).length === 0) {
24
- return { match_phrase_prefix: { [field]: value } };
25
- }
26
- return { match_phrase_prefix: { [field]: { query: value, ...options } } };
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ const createClauseMethods = (wrap) => ({
5
+ // eslint-disable-next-line functional/functional-parameters
6
+ matchAll: () => wrap({ match_all: {} }),
7
+ match: (field, value, options) => wrap({ match: { [field]: options ? { query: value, ...options } : value } }),
8
+ multiMatch: (fields, query, options) => wrap({ multi_match: { fields, query, ...(options && options) } }),
9
+ matchPhrase: (field, query) => wrap({ match_phrase: { [field]: query } }),
10
+ matchPhrasePrefix: (field, value, options) => wrap({ match_phrase_prefix: { [field]: options ? { query: value, ...options } : value } }),
11
+ term: (field, value) => wrap({ term: { [field]: value } }),
12
+ terms: (field, value) => wrap({ terms: { [field]: value } }),
13
+ range: (field, conditions) => wrap({ range: { [field]: conditions } }),
14
+ exists: (field) => wrap({ exists: { field } }),
15
+ prefix: (field, value) => wrap({ prefix: { [field]: value } }),
16
+ wildcard: (field, value) => wrap({ wildcard: { [field]: value } }),
17
+ fuzzy: (field, value, options) => wrap({ fuzzy: { [field]: options ? { value, ...options } : { value } } }),
18
+ ids: (values) => wrap({ ids: { values } }),
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ script: (options) => {
21
+ const { source, lang = 'painless', params, boost } = options;
22
+ return wrap({
23
+ script: {
24
+ script: { source, lang, ...(params !== undefined && { params }) },
25
+ ...(boost !== undefined && { boost })
26
+ }
27
+ });
27
28
  },
28
- term: (field, value) => ({ term: { [field]: value } }),
29
- terms: (field, value) => ({ terms: { [field]: value } }),
30
- range: (field, conditions) => ({ range: { [field]: conditions } }),
31
- exists: (field) => ({ exists: { field } }),
32
- prefix: (field, value) => ({ prefix: { [field]: value } }),
33
- wildcard: (field, value) => ({ wildcard: { [field]: value } }),
34
- fuzzy: (field, value, options) => {
35
- if (!options || Object.keys(options).length === 0) {
36
- return { fuzzy: { [field]: { value } } };
29
+ combinedFields: (fields, query, options) => wrap({ combined_fields: { fields, query, ...(options && options) } }),
30
+ queryString: (query, options) => wrap({ query_string: { query, ...(options && options) } }),
31
+ simpleQueryString: (query, options) => wrap({ simple_query_string: { query, ...(options && options) } }),
32
+ moreLikeThis: (fields, like, options) => wrap({
33
+ more_like_this: {
34
+ fields,
35
+ like: Array.isArray(like) ? like : [like],
36
+ ...(options && options)
37
37
  }
38
- return { fuzzy: { [field]: { value, ...options } } };
39
- },
40
- ids: (values) => ({ ids: { values } }),
38
+ }),
39
+ matchBoolPrefix: (field, value, options) => wrap({ match_bool_prefix: { [field]: options ? { query: value, ...options } : value } })
40
+ });
41
+ // eslint-disable-next-line functional/functional-parameters
42
+ const createClauseBuilder = () => ({
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ ...createClauseMethods((dsl) => dsl),
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
46
  knn: (field, queryVector, options) => {
42
- const { k, num_candidates, filter, boost, similarity } = options;
47
+ const { k, num_candidates, ...restOptions } = options;
43
48
  return {
44
49
  knn: {
45
- field: String(field),
50
+ field,
46
51
  query_vector: queryVector,
47
52
  k,
48
53
  num_candidates,
49
- ...(filter ? { filter } : {}),
50
- ...(boost ? { boost } : {}),
51
- ...(similarity !== undefined ? { similarity } : {})
54
+ ...(restOptions && restOptions)
52
55
  }
53
56
  };
54
57
  },
55
- script: (options) => {
56
- const { source, lang = 'painless', params, boost } = options;
57
- return {
58
- script: {
59
- script: { source, lang, ...(params ? { params } : {}) },
60
- ...(boost ? { boost } : {})
61
- }
62
- };
63
- },
64
- when: (condition, thenFn, elseFn) => {
65
- if (condition) {
66
- return thenFn(createClauseBuilder());
67
- }
68
- return elseFn ? elseFn(createClauseBuilder()) : undefined;
69
- }
58
+ when: (condition, thenFn, elseFn) => condition ? thenFn(createClauseBuilder()) : elseFn ? elseFn(createClauseBuilder()) : undefined
70
59
  });
71
60
  export const createQueryBuilder = (state = {}) => ({
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ ...createClauseMethods((dsl) => createQueryBuilder({ ...state, query: dsl })),
63
+ // eslint-disable-next-line functional/functional-parameters
72
64
  bool: () => createQueryBuilder({ ...state, query: { bool: {} } }),
73
65
  must: (builderFn) => {
74
66
  const clause = builderFn(createClauseBuilder());
75
67
  const existing = state.query?.bool?.must || [];
76
68
  return createQueryBuilder({
77
69
  ...state,
78
- query: { bool: { ...state.query.bool, must: [...existing, clause] } }
70
+ query: { bool: { ...state.query.bool, must: [...existing, clause].filter((c) => c !== undefined) } }
79
71
  });
80
72
  },
81
73
  mustNot: (builderFn) => {
@@ -83,7 +75,7 @@ export const createQueryBuilder = (state = {}) => ({
83
75
  const existing = state.query?.bool?.must_not || [];
84
76
  return createQueryBuilder({
85
77
  ...state,
86
- query: { bool: { ...state.query.bool, must_not: [...existing, clause] } }
78
+ query: { bool: { ...state.query.bool, must_not: [...existing, clause].filter((c) => c !== undefined) } }
87
79
  });
88
80
  },
89
81
  should: (builderFn) => {
@@ -91,7 +83,7 @@ export const createQueryBuilder = (state = {}) => ({
91
83
  const existing = state.query?.bool?.should || [];
92
84
  return createQueryBuilder({
93
85
  ...state,
94
- query: { bool: { ...state.query.bool, should: [...existing, clause] } }
86
+ query: { bool: { ...state.query.bool, should: [...existing, clause].filter((c) => c !== undefined) } }
95
87
  });
96
88
  },
97
89
  filter: (builderFn) => {
@@ -99,116 +91,36 @@ export const createQueryBuilder = (state = {}) => ({
99
91
  const existing = state.query?.bool?.filter || [];
100
92
  return createQueryBuilder({
101
93
  ...state,
102
- query: { bool: { ...state.query.bool, filter: [...existing, clause] } }
94
+ query: { bool: { ...state.query.bool, filter: [...existing, clause].filter((c) => c !== undefined) } }
103
95
  });
104
96
  },
105
97
  minimumShouldMatch: (value) => createQueryBuilder({
106
98
  ...state,
107
99
  query: { bool: { ...state.query.bool, minimum_should_match: value } }
108
100
  }),
109
- matchAll: () => createQueryBuilder({ ...state, query: { match_all: {} } }),
110
- match: (field, value, options) => {
111
- if (!options || Object.keys(options).length === 0) {
112
- return createQueryBuilder({
113
- ...state,
114
- query: { match: { [field]: value } }
115
- });
116
- }
117
- return createQueryBuilder({
118
- ...state,
119
- query: { match: { [field]: { query: value, ...options } } }
120
- });
121
- },
122
- multiMatch: (fields, query, options) => {
123
- if (!options || Object.keys(options).length === 0) {
124
- return createQueryBuilder({
125
- ...state,
126
- query: { multi_match: { fields, query } }
127
- });
128
- }
129
- return createQueryBuilder({
130
- ...state,
131
- query: { multi_match: { fields, query, ...options } }
132
- });
133
- },
134
- matchPhrase: (field, value) => createQueryBuilder({
135
- ...state,
136
- query: { match_phrase: { [field]: value } }
137
- }),
138
- matchPhrasePrefix: (field, value, options) => {
139
- if (!options || Object.keys(options).length === 0) {
140
- return createQueryBuilder({
141
- ...state,
142
- query: { match_phrase_prefix: { [field]: value } }
143
- });
144
- }
145
- return createQueryBuilder({
146
- ...state,
147
- query: { match_phrase_prefix: { [field]: { query: value, ...options } } }
148
- });
149
- },
150
- term: (field, value) => createQueryBuilder({ ...state, query: { term: { [field]: value } } }),
151
- terms: (field, values) => createQueryBuilder({ ...state, query: { terms: { [field]: values } } }),
152
- range: (field, conditions) => createQueryBuilder({
153
- ...state,
154
- query: { range: { [field]: conditions } }
155
- }),
156
- exists: (field) => createQueryBuilder({ ...state, query: { exists: { field } } }),
157
- prefix: (field, value) => createQueryBuilder({ ...state, query: { prefix: { [field]: value } } }),
158
- wildcard: (field, value) => createQueryBuilder({
159
- ...state,
160
- query: { wildcard: { [field]: value } }
161
- }),
162
- fuzzy: (field, value, options) => {
163
- if (!options || Object.keys(options).length === 0) {
164
- return createQueryBuilder({
165
- ...state,
166
- query: { fuzzy: { [field]: { value } } }
167
- });
168
- }
169
- return createQueryBuilder({
170
- ...state,
171
- query: { fuzzy: { [field]: { value, ...options } } }
172
- });
173
- },
174
- ids: (values) => createQueryBuilder({ ...state, query: { ids: { values } } }),
175
- nested: (path, fn, options) => {
176
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
177
- const nestedQuery = fn(createClauseBuilder());
178
- return createQueryBuilder({
179
- ...state,
180
- query: {
181
- nested: {
182
- path,
183
- query: nestedQuery,
184
- ...(options && Object.keys(options).length > 0 ? options : {})
185
- }
186
- }
187
- });
188
- },
189
101
  knn: (field, queryVector, options) => {
190
- const { k, num_candidates, filter, boost, similarity } = options;
102
+ const { k, num_candidates, ...restOptions } = options;
191
103
  return createQueryBuilder({
192
104
  ...state,
193
105
  knn: {
194
- field: String(field),
106
+ field,
195
107
  query_vector: queryVector,
196
108
  k,
197
109
  num_candidates,
198
- ...(filter ? { filter } : {}),
199
- ...(boost ? { boost } : {}),
200
- ...(similarity !== undefined ? { similarity } : {})
110
+ ...(restOptions && restOptions)
201
111
  }
202
112
  });
203
113
  },
204
- script: (options) => {
205
- const { source, lang = 'painless', params, boost } = options;
114
+ nested: (path, fn, options) => {
115
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
+ const nestedQuery = fn(createClauseBuilder());
206
117
  return createQueryBuilder({
207
118
  ...state,
208
119
  query: {
209
- script: {
210
- script: { source, lang, ...(params ? { params } : {}) },
211
- ...(boost ? { boost } : {})
120
+ nested: {
121
+ path,
122
+ query: nestedQuery,
123
+ ...(options && options)
212
124
  }
213
125
  }
214
126
  });
@@ -221,22 +133,15 @@ export const createQueryBuilder = (state = {}) => ({
221
133
  query: {
222
134
  script_score: {
223
135
  query: innerQuery,
224
- script: { source, lang, ...(params ? { params } : {}) },
225
- ...(options?.min_score !== undefined
226
- ? { min_score: options.min_score }
227
- : {}),
228
- ...(options?.boost ? { boost: options.boost } : {})
136
+ script: { source, lang, ...(params !== undefined && { params }) },
137
+ ...(options?.min_score !== undefined && { min_score: options.min_score }),
138
+ ...(options?.boost !== undefined && { boost: options.boost })
229
139
  }
230
140
  }
231
141
  });
232
142
  },
233
143
  percolate: (options) => createQueryBuilder({ ...state, query: { percolate: { ...options } } }),
234
- when: (condition, thenFn, elseFn) => {
235
- if (condition) {
236
- return thenFn(createQueryBuilder(state));
237
- }
238
- return elseFn ? elseFn(createQueryBuilder(state)) : undefined;
239
- },
144
+ when: (condition, thenFn, elseFn) => condition ? thenFn(createQueryBuilder(state)) : elseFn ? elseFn(createQueryBuilder(state)) : undefined,
240
145
  sort: (field, direction = 'asc') => {
241
146
  const existing = state.sort || [];
242
147
  return createQueryBuilder({
@@ -255,13 +160,10 @@ export const createQueryBuilder = (state = {}) => ({
255
160
  seqNoPrimaryTerm: (seq_no_primary_term) => createQueryBuilder({ ...state, seq_no_primary_term }),
256
161
  trackTotalHits: (track_total_hits = true) => createQueryBuilder({ ...state, track_total_hits }),
257
162
  highlight: (fields, options) => {
258
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
- const highlightFields = {};
260
163
  const { pre_tags, post_tags, ...fieldOptions } = options || {};
261
- for (const field of fields) {
262
- highlightFields[field] =
263
- Object.keys(fieldOptions).length > 0 ? fieldOptions : {};
264
- }
164
+ const fieldValue = Object.keys(fieldOptions).length > 0 ? fieldOptions : {};
165
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
+ const highlightFields = Object.fromEntries(fields.map((field) => [field, fieldValue]));
265
167
  return createQueryBuilder({
266
168
  ...state,
267
169
  highlight: {
@@ -273,28 +175,20 @@ export const createQueryBuilder = (state = {}) => ({
273
175
  },
274
176
  geoDistance: (field, center, options) => createQueryBuilder({
275
177
  ...state,
276
- query: { geo_distance: { [String(field)]: center, ...options } }
178
+ query: { geo_distance: { [field]: center, ...options } }
277
179
  }),
278
180
  geoBoundingBox: (field, options) => createQueryBuilder({
279
181
  ...state,
280
- query: { geo_bounding_box: { [String(field)]: options } }
182
+ query: { geo_bounding_box: { [field]: options } }
281
183
  }),
282
184
  geoPolygon: (field, options) => createQueryBuilder({
283
185
  ...state,
284
- query: { geo_polygon: { [String(field)]: options } }
186
+ query: { geo_polygon: { [field]: options } }
187
+ }),
188
+ regexp: (field, value, options) => createQueryBuilder({
189
+ ...state,
190
+ query: { regexp: { [field]: options ? { value, ...options } : value } }
285
191
  }),
286
- regexp: (field, value, options) => {
287
- if (!options || Object.keys(options).length === 0) {
288
- return createQueryBuilder({
289
- ...state,
290
- query: { regexp: { [String(field)]: value } }
291
- });
292
- }
293
- return createQueryBuilder({
294
- ...state,
295
- query: { regexp: { [String(field)]: { value, ...options } } }
296
- });
297
- },
298
192
  constantScore: (fn, options) => {
299
193
  const clause = fn(createClauseBuilder());
300
194
  return createQueryBuilder({
@@ -302,11 +196,36 @@ export const createQueryBuilder = (state = {}) => ({
302
196
  query: {
303
197
  constant_score: {
304
198
  filter: clause,
305
- ...(options && Object.keys(options).length > 0 ? options : {})
199
+ ...(options && options)
200
+ }
201
+ }
202
+ });
203
+ },
204
+ searchAfter: (values) => createQueryBuilder({ ...state, search_after: values }),
205
+ preference: (value) => createQueryBuilder({ ...state, preference: value }),
206
+ collapse: (field, options) => createQueryBuilder({
207
+ ...state,
208
+ collapse: {
209
+ field,
210
+ ...(options && options)
211
+ }
212
+ }),
213
+ rescore: (queryFn, windowSize, options) => {
214
+ const rescoreQuery = queryFn(createClauseBuilder());
215
+ return createQueryBuilder({
216
+ ...state,
217
+ rescore: {
218
+ window_size: windowSize,
219
+ query: {
220
+ rescore_query: rescoreQuery,
221
+ ...(options && options)
306
222
  }
307
223
  }
308
224
  });
309
225
  },
226
+ storedFields: (fields) => createQueryBuilder({ ...state, stored_fields: fields }),
227
+ terminateAfter: (count) => createQueryBuilder({ ...state, terminate_after: count }),
228
+ indicesBoost: (boosts) => createQueryBuilder({ ...state, indices_boost: boosts }),
310
229
  aggs: (fn) => {
311
230
  const aggBuilder = createAggregationBuilder();
312
231
  const builtAggs = fn(aggBuilder).build();
@@ -320,8 +239,10 @@ export const createQueryBuilder = (state = {}) => ({
320
239
  suggest: builtSuggestions.suggest
321
240
  });
322
241
  },
242
+ // eslint-disable-next-line functional/functional-parameters
323
243
  build: () => {
324
244
  const { _includeQuery, ...rest } = state;
245
+ // eslint-disable-next-line functional/no-conditional-statements
325
246
  if (_includeQuery === false) {
326
247
  const { query: _q, ...noQuery } = rest;
327
248
  return noQuery;