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.
- package/README.md +61 -14
- package/dist/__tests__/aggregation-builder.test.d.ts +2 -0
- package/dist/__tests__/aggregation-builder.test.d.ts.map +1 -0
- package/dist/__tests__/aggregation-builder.test.js +622 -0
- package/dist/__tests__/bulk.test.d.ts +2 -0
- package/dist/__tests__/bulk.test.d.ts.map +1 -0
- package/dist/__tests__/bulk.test.js +679 -0
- package/dist/__tests__/examples.test.d.ts +2 -0
- package/dist/__tests__/examples.test.d.ts.map +1 -0
- package/dist/__tests__/examples.test.js +2123 -0
- package/dist/__tests__/fixtures/finance.d.ts +58 -0
- package/dist/__tests__/fixtures/finance.d.ts.map +1 -0
- package/dist/__tests__/fixtures/finance.js +73 -0
- package/dist/__tests__/fixtures/legal.d.ts +14 -0
- package/dist/__tests__/fixtures/legal.d.ts.map +1 -0
- package/dist/__tests__/fixtures/legal.js +27 -0
- package/dist/__tests__/fixtures/real-estate.d.ts +31 -0
- package/dist/__tests__/fixtures/real-estate.d.ts.map +1 -0
- package/dist/__tests__/fixtures/real-estate.js +39 -0
- package/dist/__tests__/index-management.test.d.ts +2 -0
- package/dist/__tests__/index-management.test.d.ts.map +1 -0
- package/dist/__tests__/index-management.test.js +1699 -0
- package/dist/__tests__/integration/aggregation.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/aggregation.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/aggregation.integration.test.js +188 -0
- package/dist/__tests__/integration/bulk.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/bulk.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bulk.integration.test.js +90 -0
- package/dist/__tests__/integration/fixtures/finance.d.ts +37 -0
- package/dist/__tests__/integration/fixtures/finance.d.ts.map +1 -0
- package/dist/__tests__/integration/fixtures/finance.js +58 -0
- package/dist/__tests__/integration/fixtures/legal.d.ts +38 -0
- package/dist/__tests__/integration/fixtures/legal.d.ts.map +1 -0
- package/dist/__tests__/integration/fixtures/legal.js +65 -0
- package/dist/__tests__/integration/fixtures/real-estate.d.ts +17 -0
- package/dist/__tests__/integration/fixtures/real-estate.d.ts.map +1 -0
- package/dist/__tests__/integration/fixtures/real-estate.js +28 -0
- package/dist/__tests__/integration/helpers.d.ts +15 -0
- package/dist/__tests__/integration/helpers.d.ts.map +1 -0
- package/dist/__tests__/integration/helpers.js +21 -0
- package/dist/__tests__/integration/index-management.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/index-management.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/index-management.integration.test.js +67 -0
- package/dist/__tests__/integration/multi-search.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/multi-search.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/multi-search.integration.test.js +49 -0
- package/dist/__tests__/integration/query.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/query.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/query.integration.test.js +101 -0
- package/dist/__tests__/integration/suggester.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/suggester.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/suggester.integration.test.js +42 -0
- package/dist/__tests__/multi-search.test.d.ts +2 -0
- package/dist/__tests__/multi-search.test.d.ts.map +1 -0
- package/dist/__tests__/multi-search.test.js +325 -0
- package/dist/__tests__/query-builder-extensions.test.d.ts +2 -0
- package/dist/__tests__/query-builder-extensions.test.d.ts.map +1 -0
- package/dist/__tests__/query-builder-extensions.test.js +436 -0
- package/dist/__tests__/query-builder.test.d.ts +2 -0
- package/dist/__tests__/query-builder.test.d.ts.map +1 -0
- package/dist/__tests__/query-builder.test.js +5482 -0
- package/dist/__tests__/settings-presets.test.d.ts +2 -0
- package/dist/__tests__/settings-presets.test.d.ts.map +1 -0
- package/dist/__tests__/settings-presets.test.js +183 -0
- package/dist/__tests__/suggester.test.d.ts +2 -0
- package/dist/__tests__/suggester.test.d.ts.map +1 -0
- package/dist/__tests__/suggester.test.js +1006 -0
- package/dist/aggregation.builder.d.ts.map +1 -1
- package/dist/aggregation.builder.js +101 -94
- package/dist/aggregation.types.d.ts +10 -9
- package/dist/aggregation.types.d.ts.map +1 -1
- package/dist/bulk.builder.d.ts +11 -1
- package/dist/bulk.builder.d.ts.map +1 -1
- package/dist/bulk.builder.js +10 -11
- package/dist/bulk.types.d.ts.map +1 -1
- package/dist/field.helpers.d.ts +59 -4
- package/dist/field.helpers.d.ts.map +1 -1
- package/dist/field.helpers.js +87 -4
- package/dist/field.types.d.ts +78 -1
- package/dist/field.types.d.ts.map +1 -1
- package/dist/index-management.builder.d.ts +15 -3
- package/dist/index-management.builder.d.ts.map +1 -1
- package/dist/index-management.builder.js +32 -8
- package/dist/index-management.types.d.ts +27 -3
- package/dist/index-management.types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/mapping.builder.d.ts +16 -3
- package/dist/mapping.builder.d.ts.map +1 -1
- package/dist/mapping.builder.js +22 -7
- package/dist/mapping.types.d.ts +29 -6
- package/dist/mapping.types.d.ts.map +1 -1
- package/dist/multi-search.builder.d.ts +1 -1
- package/dist/multi-search.builder.d.ts.map +1 -1
- package/dist/multi-search.builder.js +5 -3
- package/dist/query.builder.d.ts +0 -4
- package/dist/query.builder.d.ts.map +1 -1
- package/dist/query.builder.js +104 -183
- package/dist/query.types.d.ts +59 -5
- package/dist/query.types.d.ts.map +1 -1
- package/dist/settings.presets.d.ts +98 -0
- package/dist/settings.presets.d.ts.map +1 -0
- package/dist/settings.presets.js +115 -0
- package/dist/suggester.builder.d.ts.map +1 -1
- package/dist/suggester.builder.js +1 -0
- package/dist/suggester.types.d.ts.map +1 -1
- package/dist/vector.types.d.ts.map +1 -1
- package/package.json +6 -3
package/dist/mapping.types.d.ts
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,
|
|
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
|
|
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,
|
|
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
|
|
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')
|
|
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
|
|
34
|
+
* const ms = msearch(productMappings)
|
|
33
35
|
* .addQuery(query1.build(), { index: 'products' })
|
|
34
36
|
* .addQuery(query2.build(), { index: 'products' })
|
|
35
37
|
* .build();
|
package/dist/query.builder.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/query.builder.js
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
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,
|
|
47
|
+
const { k, num_candidates, ...restOptions } = options;
|
|
43
48
|
return {
|
|
44
49
|
knn: {
|
|
45
|
-
field
|
|
50
|
+
field,
|
|
46
51
|
query_vector: queryVector,
|
|
47
52
|
k,
|
|
48
53
|
num_candidates,
|
|
49
|
-
...(
|
|
50
|
-
...(boost ? { boost } : {}),
|
|
51
|
-
...(similarity !== undefined ? { similarity } : {})
|
|
54
|
+
...(restOptions && restOptions)
|
|
52
55
|
}
|
|
53
56
|
};
|
|
54
57
|
},
|
|
55
|
-
|
|
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,
|
|
102
|
+
const { k, num_candidates, ...restOptions } = options;
|
|
191
103
|
return createQueryBuilder({
|
|
192
104
|
...state,
|
|
193
105
|
knn: {
|
|
194
|
-
field
|
|
106
|
+
field,
|
|
195
107
|
query_vector: queryVector,
|
|
196
108
|
k,
|
|
197
109
|
num_candidates,
|
|
198
|
-
...(
|
|
199
|
-
...(boost ? { boost } : {}),
|
|
200
|
-
...(similarity !== undefined ? { similarity } : {})
|
|
110
|
+
...(restOptions && restOptions)
|
|
201
111
|
}
|
|
202
112
|
});
|
|
203
113
|
},
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
|
225
|
-
...(options?.min_score !== undefined
|
|
226
|
-
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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: { [
|
|
178
|
+
query: { geo_distance: { [field]: center, ...options } }
|
|
277
179
|
}),
|
|
278
180
|
geoBoundingBox: (field, options) => createQueryBuilder({
|
|
279
181
|
...state,
|
|
280
|
-
query: { geo_bounding_box: { [
|
|
182
|
+
query: { geo_bounding_box: { [field]: options } }
|
|
281
183
|
}),
|
|
282
184
|
geoPolygon: (field, options) => createQueryBuilder({
|
|
283
185
|
...state,
|
|
284
|
-
query: { geo_polygon: { [
|
|
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 &&
|
|
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;
|