elastiq-ts 0.1.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/LICENSE +21 -0
- package/README.md +1157 -0
- package/dist/__tests__/elastic.helpers.d.ts +17 -0
- package/dist/__tests__/elastic.helpers.d.ts.map +1 -0
- package/dist/__tests__/elastic.helpers.js +46 -0
- package/dist/aggregation-builder.d.ts +4 -0
- package/dist/aggregation-builder.d.ts.map +1 -0
- package/dist/aggregation-builder.js +153 -0
- package/dist/aggregation-types.d.ts +234 -0
- package/dist/aggregation-types.d.ts.map +1 -0
- package/dist/aggregation-types.js +6 -0
- package/dist/bulk-types.d.ts +67 -0
- package/dist/bulk-types.d.ts.map +1 -0
- package/dist/bulk-types.js +6 -0
- package/dist/bulk.d.ts +22 -0
- package/dist/bulk.d.ts.map +1 -0
- package/dist/bulk.js +55 -0
- package/dist/index-management.d.ts +30 -0
- package/dist/index-management.d.ts.map +1 -0
- package/dist/index-management.js +48 -0
- package/dist/index-types.d.ts +87 -0
- package/dist/index-types.d.ts.map +1 -0
- package/dist/index-types.js +6 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/multi-search-types.d.ts +41 -0
- package/dist/multi-search-types.d.ts.map +1 -0
- package/dist/multi-search-types.js +6 -0
- package/dist/multi-search.d.ts +20 -0
- package/dist/multi-search.d.ts.map +1 -0
- package/dist/multi-search.js +42 -0
- package/dist/query-builder.d.ts +12 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +396 -0
- package/dist/suggester-types.d.ts +130 -0
- package/dist/suggester-types.d.ts.map +1 -0
- package/dist/suggester-types.js +6 -0
- package/dist/suggester.d.ts +21 -0
- package/dist/suggester.d.ts.map +1 -0
- package/dist/suggester.js +55 -0
- package/dist/types.d.ts +378 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/vector-types.d.ts +42 -0
- package/dist/vector-types.d.ts.map +1 -0
- package/dist/vector-types.js +6 -0
- package/package.json +69 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Query builder implementation
|
|
4
|
+
* Builds type-safe Elasticsearch queries with a fluent API
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createQueryBuilder = void 0;
|
|
8
|
+
const aggregation_builder_1 = require("./aggregation-builder");
|
|
9
|
+
const suggester_1 = require("./suggester");
|
|
10
|
+
/**
|
|
11
|
+
* Creates a clause builder for constructing query clauses
|
|
12
|
+
* Used within bool query contexts (must, should, filter, must_not)
|
|
13
|
+
*/
|
|
14
|
+
const createClauseBuilder = () => ({
|
|
15
|
+
matchAll: () => ({ match_all: {} }),
|
|
16
|
+
match: (field, value, options) => {
|
|
17
|
+
if (!options || Object.keys(options).length === 0) {
|
|
18
|
+
return { match: { [field]: value } };
|
|
19
|
+
}
|
|
20
|
+
return { match: { [field]: { query: value, ...options } } };
|
|
21
|
+
},
|
|
22
|
+
multiMatch: (fields, query, options) => {
|
|
23
|
+
if (!options || Object.keys(options).length === 0) {
|
|
24
|
+
return { multi_match: { fields, query } };
|
|
25
|
+
}
|
|
26
|
+
return { multi_match: { fields, query, ...options } };
|
|
27
|
+
},
|
|
28
|
+
matchPhrase: (field, query) => ({ match_phrase: { [field]: query } }),
|
|
29
|
+
matchPhrasePrefix: (field, value, options) => {
|
|
30
|
+
if (!options || Object.keys(options).length === 0) {
|
|
31
|
+
return { match_phrase_prefix: { [field]: value } };
|
|
32
|
+
}
|
|
33
|
+
return { match_phrase_prefix: { [field]: { query: value, ...options } } };
|
|
34
|
+
},
|
|
35
|
+
term: (field, value) => ({ term: { [field]: value } }),
|
|
36
|
+
terms: (field, value) => ({ terms: { [field]: value } }),
|
|
37
|
+
range: (field, conditions) => ({ range: { [field]: conditions } }),
|
|
38
|
+
exists: (field) => ({ exists: { field } }),
|
|
39
|
+
prefix: (field, value) => ({ prefix: { [field]: value } }),
|
|
40
|
+
wildcard: (field, value) => ({ wildcard: { [field]: value } }),
|
|
41
|
+
fuzzy: (field, value, options) => {
|
|
42
|
+
if (!options || Object.keys(options).length === 0) {
|
|
43
|
+
return { fuzzy: { [field]: { value } } };
|
|
44
|
+
}
|
|
45
|
+
return { fuzzy: { [field]: { value, ...options } } };
|
|
46
|
+
},
|
|
47
|
+
ids: (values) => ({ ids: { values } }),
|
|
48
|
+
knn: (field, queryVector, options) => {
|
|
49
|
+
const { k, num_candidates, filter, boost, similarity } = options;
|
|
50
|
+
return {
|
|
51
|
+
knn: {
|
|
52
|
+
field: String(field),
|
|
53
|
+
query_vector: queryVector,
|
|
54
|
+
k,
|
|
55
|
+
num_candidates,
|
|
56
|
+
...(filter ? { filter } : {}),
|
|
57
|
+
...(boost ? { boost } : {}),
|
|
58
|
+
...(similarity !== undefined ? { similarity } : {})
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
script: (options) => {
|
|
63
|
+
const { source, lang = 'painless', params, boost } = options;
|
|
64
|
+
return {
|
|
65
|
+
script: {
|
|
66
|
+
script: {
|
|
67
|
+
source,
|
|
68
|
+
lang,
|
|
69
|
+
...(params ? { params } : {})
|
|
70
|
+
},
|
|
71
|
+
...(boost ? { boost } : {})
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
when: (condition, thenFn, elseFn) => {
|
|
76
|
+
if (condition) {
|
|
77
|
+
return thenFn(createClauseBuilder());
|
|
78
|
+
}
|
|
79
|
+
return elseFn ? elseFn(createClauseBuilder()) : undefined;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
/** Shared clause builder instance */
|
|
83
|
+
const clauseBuilder = createClauseBuilder();
|
|
84
|
+
/**
|
|
85
|
+
* Creates a query builder with immutable state
|
|
86
|
+
* @param state - Current query state (optional)
|
|
87
|
+
* @returns QueryBuilder instance with fluent API
|
|
88
|
+
*/
|
|
89
|
+
const createQueryBuilder = (state = {}) => ({
|
|
90
|
+
// Boolean query methods
|
|
91
|
+
bool: () => (0, exports.createQueryBuilder)({ ...state, query: { bool: {} } }),
|
|
92
|
+
must: (builderFn) => {
|
|
93
|
+
const clause = builderFn(clauseBuilder);
|
|
94
|
+
const existing = state.query?.bool?.must || [];
|
|
95
|
+
return (0, exports.createQueryBuilder)({
|
|
96
|
+
...state,
|
|
97
|
+
query: { bool: { ...state.query.bool, must: [...existing, clause] } }
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
mustNot: (builderFn) => {
|
|
101
|
+
const clause = builderFn(clauseBuilder);
|
|
102
|
+
const existing = state.query?.bool?.must_not || [];
|
|
103
|
+
return (0, exports.createQueryBuilder)({
|
|
104
|
+
...state,
|
|
105
|
+
query: { bool: { ...state.query.bool, must_not: [...existing, clause] } }
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
should: (builderFn) => {
|
|
109
|
+
const clause = builderFn(clauseBuilder);
|
|
110
|
+
const existing = state.query?.bool?.should || [];
|
|
111
|
+
return (0, exports.createQueryBuilder)({
|
|
112
|
+
...state,
|
|
113
|
+
query: { bool: { ...state.query.bool, should: [...existing, clause] } }
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
filter: (builderFn) => {
|
|
117
|
+
const clause = builderFn(clauseBuilder);
|
|
118
|
+
const existing = state.query?.bool?.filter || [];
|
|
119
|
+
return (0, exports.createQueryBuilder)({
|
|
120
|
+
...state,
|
|
121
|
+
query: { bool: { ...state.query.bool, filter: [...existing, clause] } }
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
minimumShouldMatch: (value) => {
|
|
125
|
+
return (0, exports.createQueryBuilder)({
|
|
126
|
+
...state,
|
|
127
|
+
query: { bool: { ...state.query.bool, minimum_should_match: value } }
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
// Full-text query methods
|
|
131
|
+
matchAll: () => (0, exports.createQueryBuilder)({ ...state, query: { match_all: {} } }),
|
|
132
|
+
match: (field, value, options) => {
|
|
133
|
+
if (!options || Object.keys(options).length === 0) {
|
|
134
|
+
return (0, exports.createQueryBuilder)({
|
|
135
|
+
...state,
|
|
136
|
+
query: { match: { [field]: value } }
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return (0, exports.createQueryBuilder)({
|
|
140
|
+
...state,
|
|
141
|
+
query: { match: { [field]: { query: value, ...options } } }
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
multiMatch: (fields, query, options) => {
|
|
145
|
+
if (!options || Object.keys(options).length === 0) {
|
|
146
|
+
return (0, exports.createQueryBuilder)({
|
|
147
|
+
...state,
|
|
148
|
+
query: { multi_match: { fields, query } }
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return (0, exports.createQueryBuilder)({
|
|
152
|
+
...state,
|
|
153
|
+
query: { multi_match: { fields, query, ...options } }
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
// Term-level query methods
|
|
157
|
+
term: (field, value) => (0, exports.createQueryBuilder)({ ...state, query: { term: { [field]: value } } }),
|
|
158
|
+
matchPhrase: (field, value) => (0, exports.createQueryBuilder)({
|
|
159
|
+
...state,
|
|
160
|
+
query: { match_phrase: { [field]: value } }
|
|
161
|
+
}),
|
|
162
|
+
matchPhrasePrefix: (field, value, options) => {
|
|
163
|
+
if (!options || Object.keys(options).length === 0) {
|
|
164
|
+
return (0, exports.createQueryBuilder)({
|
|
165
|
+
...state,
|
|
166
|
+
query: { match_phrase_prefix: { [field]: value } }
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return (0, exports.createQueryBuilder)({
|
|
170
|
+
...state,
|
|
171
|
+
query: { match_phrase_prefix: { [field]: { query: value, ...options } } }
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
terms: (field, value) => (0, exports.createQueryBuilder)({ ...state, query: { terms: { [field]: value } } }),
|
|
175
|
+
exists: (field) => (0, exports.createQueryBuilder)({ ...state, query: { exists: { field } } }),
|
|
176
|
+
prefix: (field, value) => (0, exports.createQueryBuilder)({ ...state, query: { prefix: { [field]: value } } }),
|
|
177
|
+
wildcard: (field, value) => (0, exports.createQueryBuilder)({
|
|
178
|
+
...state,
|
|
179
|
+
query: { wildcard: { [field]: value } }
|
|
180
|
+
}),
|
|
181
|
+
fuzzy: (field, value, options) => {
|
|
182
|
+
if (!options || Object.keys(options).length === 0) {
|
|
183
|
+
return (0, exports.createQueryBuilder)({
|
|
184
|
+
...state,
|
|
185
|
+
query: { fuzzy: { [field]: { value } } }
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return (0, exports.createQueryBuilder)({
|
|
189
|
+
...state,
|
|
190
|
+
query: { fuzzy: { [field]: { value, ...options } } }
|
|
191
|
+
});
|
|
192
|
+
},
|
|
193
|
+
ids: (values) => (0, exports.createQueryBuilder)({
|
|
194
|
+
...state,
|
|
195
|
+
query: { ids: { values } }
|
|
196
|
+
}),
|
|
197
|
+
// Nested query
|
|
198
|
+
nested: (path, fn, options) => {
|
|
199
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
200
|
+
const nestedQuery = fn(createClauseBuilder());
|
|
201
|
+
return (0, exports.createQueryBuilder)({
|
|
202
|
+
...state,
|
|
203
|
+
query: {
|
|
204
|
+
nested: {
|
|
205
|
+
path,
|
|
206
|
+
query: nestedQuery,
|
|
207
|
+
...(options && Object.keys(options).length > 0 ? options : {})
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
// Vector search
|
|
213
|
+
knn: (field, queryVector, options) => {
|
|
214
|
+
const { k, num_candidates, filter, boost, similarity } = options;
|
|
215
|
+
return (0, exports.createQueryBuilder)({
|
|
216
|
+
...state,
|
|
217
|
+
knn: {
|
|
218
|
+
field: String(field),
|
|
219
|
+
query_vector: queryVector,
|
|
220
|
+
k,
|
|
221
|
+
num_candidates,
|
|
222
|
+
...(filter ? { filter } : {}),
|
|
223
|
+
...(boost ? { boost } : {}),
|
|
224
|
+
...(similarity !== undefined ? { similarity } : {})
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
},
|
|
228
|
+
// Script queries
|
|
229
|
+
script: (options) => {
|
|
230
|
+
const { source, lang = 'painless', params, boost } = options;
|
|
231
|
+
return (0, exports.createQueryBuilder)({
|
|
232
|
+
...state,
|
|
233
|
+
query: {
|
|
234
|
+
script: {
|
|
235
|
+
script: {
|
|
236
|
+
source,
|
|
237
|
+
lang,
|
|
238
|
+
...(params ? { params } : {})
|
|
239
|
+
},
|
|
240
|
+
...(boost ? { boost } : {})
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
},
|
|
245
|
+
scriptScore: (queryFn, script, options) => {
|
|
246
|
+
const innerQuery = queryFn(clauseBuilder);
|
|
247
|
+
const { source, lang = 'painless', params } = script;
|
|
248
|
+
return (0, exports.createQueryBuilder)({
|
|
249
|
+
...state,
|
|
250
|
+
query: {
|
|
251
|
+
script_score: {
|
|
252
|
+
query: innerQuery,
|
|
253
|
+
script: {
|
|
254
|
+
source,
|
|
255
|
+
lang,
|
|
256
|
+
...(params ? { params } : {})
|
|
257
|
+
},
|
|
258
|
+
...(options?.min_score !== undefined
|
|
259
|
+
? { min_score: options.min_score }
|
|
260
|
+
: {}),
|
|
261
|
+
...(options?.boost ? { boost: options.boost } : {})
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
percolate: (options) => {
|
|
267
|
+
return (0, exports.createQueryBuilder)({
|
|
268
|
+
...state,
|
|
269
|
+
query: {
|
|
270
|
+
percolate: {
|
|
271
|
+
...options
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
},
|
|
276
|
+
// Conditional building
|
|
277
|
+
when: (condition, thenFn, elseFn) => {
|
|
278
|
+
if (condition) {
|
|
279
|
+
return thenFn((0, exports.createQueryBuilder)(state));
|
|
280
|
+
}
|
|
281
|
+
return elseFn ? elseFn((0, exports.createQueryBuilder)(state)) : undefined;
|
|
282
|
+
},
|
|
283
|
+
range: (field, conditions) => (0, exports.createQueryBuilder)({ ...state, query: { range: { [field]: conditions } } }),
|
|
284
|
+
// Sorting
|
|
285
|
+
sort: (field, direction = 'asc') => {
|
|
286
|
+
const existing = state.sort || [];
|
|
287
|
+
return (0, exports.createQueryBuilder)({
|
|
288
|
+
...state,
|
|
289
|
+
sort: [
|
|
290
|
+
...existing,
|
|
291
|
+
{ [field]: direction }
|
|
292
|
+
]
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
// Pagination and source filtering
|
|
296
|
+
from: (from) => (0, exports.createQueryBuilder)({ ...state, from }),
|
|
297
|
+
to: (to) => (0, exports.createQueryBuilder)({ ...state, to }),
|
|
298
|
+
size: (size) => (0, exports.createQueryBuilder)({ ...state, size }),
|
|
299
|
+
_source: (_source) => (0, exports.createQueryBuilder)({ ...state, _source }),
|
|
300
|
+
// Query parameters
|
|
301
|
+
timeout: (timeout) => (0, exports.createQueryBuilder)({ ...state, timeout }),
|
|
302
|
+
trackScores: (track_scores) => (0, exports.createQueryBuilder)({ ...state, track_scores }),
|
|
303
|
+
explain: (explain) => (0, exports.createQueryBuilder)({ ...state, explain }),
|
|
304
|
+
minScore: (min_score) => (0, exports.createQueryBuilder)({ ...state, min_score }),
|
|
305
|
+
version: (version) => (0, exports.createQueryBuilder)({ ...state, version }),
|
|
306
|
+
seqNoPrimaryTerm: (seq_no_primary_term) => (0, exports.createQueryBuilder)({ ...state, seq_no_primary_term }),
|
|
307
|
+
trackTotalHits: (track_total_hits) => (0, exports.createQueryBuilder)({ ...state, track_total_hits }),
|
|
308
|
+
highlight: (fields, options) => {
|
|
309
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
310
|
+
const highlightFields = {};
|
|
311
|
+
for (const field of fields) {
|
|
312
|
+
highlightFields[field] = options || {};
|
|
313
|
+
}
|
|
314
|
+
return (0, exports.createQueryBuilder)({
|
|
315
|
+
...state,
|
|
316
|
+
highlight: {
|
|
317
|
+
fields: highlightFields,
|
|
318
|
+
...(options?.pre_tags && { pre_tags: options.pre_tags }),
|
|
319
|
+
...(options?.post_tags && { post_tags: options.post_tags })
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
},
|
|
323
|
+
// Geo queries
|
|
324
|
+
geoDistance: (field, center, options) => (0, exports.createQueryBuilder)({
|
|
325
|
+
...state,
|
|
326
|
+
query: {
|
|
327
|
+
geo_distance: {
|
|
328
|
+
[String(field)]: center,
|
|
329
|
+
...options
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}),
|
|
333
|
+
geoBoundingBox: (field, options) => (0, exports.createQueryBuilder)({
|
|
334
|
+
...state,
|
|
335
|
+
query: {
|
|
336
|
+
geo_bounding_box: {
|
|
337
|
+
[String(field)]: options
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}),
|
|
341
|
+
geoPolygon: (field, options) => (0, exports.createQueryBuilder)({
|
|
342
|
+
...state,
|
|
343
|
+
query: {
|
|
344
|
+
geo_polygon: {
|
|
345
|
+
[String(field)]: options
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}),
|
|
349
|
+
// Pattern and scoring queries
|
|
350
|
+
regexp: (field, value, options) => {
|
|
351
|
+
if (!options || Object.keys(options).length === 0) {
|
|
352
|
+
return (0, exports.createQueryBuilder)({
|
|
353
|
+
...state,
|
|
354
|
+
query: { regexp: { [String(field)]: value } }
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return (0, exports.createQueryBuilder)({
|
|
358
|
+
...state,
|
|
359
|
+
query: { regexp: { [String(field)]: { value, ...options } } }
|
|
360
|
+
});
|
|
361
|
+
},
|
|
362
|
+
constantScore: (fn, options) => {
|
|
363
|
+
const clause = fn(clauseBuilder);
|
|
364
|
+
return (0, exports.createQueryBuilder)({
|
|
365
|
+
...state,
|
|
366
|
+
query: {
|
|
367
|
+
constant_score: {
|
|
368
|
+
filter: clause,
|
|
369
|
+
...(options && Object.keys(options).length > 0 ? options : {})
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
},
|
|
374
|
+
// Aggregations
|
|
375
|
+
aggs: (fn) => {
|
|
376
|
+
const aggBuilder = (0, aggregation_builder_1.createAggregationBuilder)();
|
|
377
|
+
const builtAggs = fn(aggBuilder).build();
|
|
378
|
+
return (0, exports.createQueryBuilder)({ ...state, aggs: builtAggs });
|
|
379
|
+
},
|
|
380
|
+
// Suggestions
|
|
381
|
+
suggest: (fn) => {
|
|
382
|
+
const suggesterBuilder = (0, suggester_1.createSuggesterBuilder)();
|
|
383
|
+
const builtSuggestions = fn(suggesterBuilder).build();
|
|
384
|
+
return (0, exports.createQueryBuilder)({ ...state, suggest: builtSuggestions.suggest });
|
|
385
|
+
},
|
|
386
|
+
// Build final query
|
|
387
|
+
build: () => {
|
|
388
|
+
const { _includeQuery, ...rest } = state;
|
|
389
|
+
if (_includeQuery === false) {
|
|
390
|
+
const { query: _q, ...noQuery } = rest;
|
|
391
|
+
return noQuery;
|
|
392
|
+
}
|
|
393
|
+
return rest;
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
exports.createQueryBuilder = createQueryBuilder;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Elasticsearch Suggesters
|
|
3
|
+
* @see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Options for term suggester
|
|
7
|
+
*/
|
|
8
|
+
export type TermSuggesterOptions = {
|
|
9
|
+
/** The field to fetch candidate suggestions from */
|
|
10
|
+
field: string;
|
|
11
|
+
/** Text analyzer to use */
|
|
12
|
+
analyzer?: string;
|
|
13
|
+
/** Maximum number of suggestions to return */
|
|
14
|
+
size?: number;
|
|
15
|
+
/** Sort order for suggestions */
|
|
16
|
+
sort?: 'score' | 'frequency';
|
|
17
|
+
/** Suggest mode */
|
|
18
|
+
suggest_mode?: 'missing' | 'popular' | 'always';
|
|
19
|
+
/** String distance algorithm */
|
|
20
|
+
string_distance?: 'internal' | 'damerau_levenshtein' | 'levenshtein' | 'jaro_winkler' | 'ngram';
|
|
21
|
+
/** Maximum edit distance */
|
|
22
|
+
max_edits?: number;
|
|
23
|
+
/** Maximum number of inspected documents */
|
|
24
|
+
max_inspections?: number;
|
|
25
|
+
/** Maximum term frequency threshold */
|
|
26
|
+
max_term_freq?: number;
|
|
27
|
+
/** Prefix length */
|
|
28
|
+
prefix_length?: number;
|
|
29
|
+
/** Minimum word length */
|
|
30
|
+
min_word_length?: number;
|
|
31
|
+
/** Minimum document frequency */
|
|
32
|
+
min_doc_freq?: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Options for phrase suggester
|
|
36
|
+
*/
|
|
37
|
+
export type PhraseSuggesterOptions = {
|
|
38
|
+
/** The field to fetch candidate suggestions from */
|
|
39
|
+
field: string;
|
|
40
|
+
/** Text analyzer to use */
|
|
41
|
+
analyzer?: string;
|
|
42
|
+
/** Maximum number of suggestions to return */
|
|
43
|
+
size?: number;
|
|
44
|
+
/** Real word error likelihood */
|
|
45
|
+
real_word_error_likelihood?: number;
|
|
46
|
+
/** Confidence threshold */
|
|
47
|
+
confidence?: number;
|
|
48
|
+
/** Maximum errors per term */
|
|
49
|
+
max_errors?: number;
|
|
50
|
+
/** Separator between terms */
|
|
51
|
+
separator?: string;
|
|
52
|
+
/** Gram size for shingle generation */
|
|
53
|
+
gram_size?: number;
|
|
54
|
+
/** Direct generators for candidate terms */
|
|
55
|
+
direct_generator?: Array<{
|
|
56
|
+
field: string;
|
|
57
|
+
suggest_mode?: 'missing' | 'popular' | 'always';
|
|
58
|
+
min_word_length?: number;
|
|
59
|
+
max_edits?: number;
|
|
60
|
+
max_inspections?: number;
|
|
61
|
+
min_doc_freq?: number;
|
|
62
|
+
max_term_freq?: number;
|
|
63
|
+
prefix_length?: number;
|
|
64
|
+
size?: number;
|
|
65
|
+
}>;
|
|
66
|
+
/** Highlight pre-tag */
|
|
67
|
+
pre_tag?: string;
|
|
68
|
+
/** Highlight post-tag */
|
|
69
|
+
post_tag?: string;
|
|
70
|
+
/** Collate query to verify suggestions */
|
|
71
|
+
collate?: {
|
|
72
|
+
query: any;
|
|
73
|
+
params?: Record<string, any>;
|
|
74
|
+
prune?: boolean;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Options for completion suggester
|
|
79
|
+
*/
|
|
80
|
+
export type CompletionSuggesterOptions = {
|
|
81
|
+
/** The field to fetch completions from (must be type: completion) */
|
|
82
|
+
field: string;
|
|
83
|
+
/** Maximum number of suggestions to return */
|
|
84
|
+
size?: number;
|
|
85
|
+
/** Skip duplicates */
|
|
86
|
+
skip_duplicates?: boolean;
|
|
87
|
+
/** Fuzzy matching options */
|
|
88
|
+
fuzzy?: {
|
|
89
|
+
/** Enable fuzzy matching */
|
|
90
|
+
fuzziness?: string | number;
|
|
91
|
+
/** Whether transpositions should be treated as one change */
|
|
92
|
+
transpositions?: boolean;
|
|
93
|
+
/** Minimum length before fuzzy matching is used */
|
|
94
|
+
min_length?: number;
|
|
95
|
+
/** Prefix length */
|
|
96
|
+
prefix_length?: number;
|
|
97
|
+
/** Whether all measurements should be in Unicode code points */
|
|
98
|
+
unicode_aware?: boolean;
|
|
99
|
+
};
|
|
100
|
+
/** Context filtering */
|
|
101
|
+
contexts?: Record<string, string | string[]>;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Suggester state for build output
|
|
105
|
+
*/
|
|
106
|
+
export type SuggesterState = {
|
|
107
|
+
[suggesterName: string]: {
|
|
108
|
+
text?: string;
|
|
109
|
+
prefix?: string;
|
|
110
|
+
term?: TermSuggesterOptions;
|
|
111
|
+
phrase?: PhraseSuggesterOptions;
|
|
112
|
+
completion?: CompletionSuggesterOptions;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Suggester builder interface
|
|
117
|
+
*/
|
|
118
|
+
export type SuggesterBuilder<T> = {
|
|
119
|
+
/** Term suggester - suggests corrections for individual terms */
|
|
120
|
+
term: (name: string, text: string, options: TermSuggesterOptions) => SuggesterBuilder<T>;
|
|
121
|
+
/** Phrase suggester - suggests corrections for entire phrases */
|
|
122
|
+
phrase: (name: string, text: string, options: PhraseSuggesterOptions) => SuggesterBuilder<T>;
|
|
123
|
+
/** Completion suggester - autocomplete functionality */
|
|
124
|
+
completion: (name: string, prefix: string, options: CompletionSuggesterOptions) => SuggesterBuilder<T>;
|
|
125
|
+
/** Build suggester DSL */
|
|
126
|
+
build: () => {
|
|
127
|
+
suggest: SuggesterState;
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=suggester-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggester-types.d.ts","sourceRoot":"","sources":["../src/suggester-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suggester builder
|
|
3
|
+
* Provides query suggestions, phrase corrections, and autocomplete functionality
|
|
4
|
+
*/
|
|
5
|
+
import { SuggesterBuilder, SuggesterState } from './suggester-types';
|
|
6
|
+
/**
|
|
7
|
+
* Creates a suggester builder
|
|
8
|
+
* @returns SuggesterBuilder instance
|
|
9
|
+
*/
|
|
10
|
+
export declare const createSuggesterBuilder: <T>(state?: SuggesterState) => SuggesterBuilder<T>;
|
|
11
|
+
/**
|
|
12
|
+
* Factory function to create a new suggester builder
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const suggestions = suggest<Product>()
|
|
16
|
+
* .term('name-suggestions', 'laptop', { field: 'name', size: 5 })
|
|
17
|
+
* .build();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const suggest: <T>() => SuggesterBuilder<T>;
|
|
21
|
+
//# sourceMappingURL=suggester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggester.d.ts","sourceRoot":"","sources":["../src/suggester.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EACtC,QAAO,cAAmB,KACzB,gBAAgB,CAAC,CAAC,CAkCnB,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,0BAAkC,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Suggester builder
|
|
4
|
+
* Provides query suggestions, phrase corrections, and autocomplete functionality
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.suggest = exports.createSuggesterBuilder = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a suggester builder
|
|
10
|
+
* @returns SuggesterBuilder instance
|
|
11
|
+
*/
|
|
12
|
+
const createSuggesterBuilder = (state = {}) => ({
|
|
13
|
+
term: (name, text, options) => {
|
|
14
|
+
return (0, exports.createSuggesterBuilder)({
|
|
15
|
+
...state,
|
|
16
|
+
[name]: {
|
|
17
|
+
text,
|
|
18
|
+
term: options
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
phrase: (name, text, options) => {
|
|
23
|
+
return (0, exports.createSuggesterBuilder)({
|
|
24
|
+
...state,
|
|
25
|
+
[name]: {
|
|
26
|
+
text,
|
|
27
|
+
phrase: options
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
completion: (name, prefix, options) => {
|
|
32
|
+
return (0, exports.createSuggesterBuilder)({
|
|
33
|
+
...state,
|
|
34
|
+
[name]: {
|
|
35
|
+
prefix,
|
|
36
|
+
completion: options
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
build: () => ({
|
|
41
|
+
suggest: state
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
exports.createSuggesterBuilder = createSuggesterBuilder;
|
|
45
|
+
/**
|
|
46
|
+
* Factory function to create a new suggester builder
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const suggestions = suggest<Product>()
|
|
50
|
+
* .term('name-suggestions', 'laptop', { field: 'name', size: 5 })
|
|
51
|
+
* .build();
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
const suggest = () => (0, exports.createSuggesterBuilder)();
|
|
55
|
+
exports.suggest = suggest;
|