@memberjunction/search-engine 0.0.1 → 5.25.0
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/dist/generic/EntitySearchProvider.d.ts +54 -0
- package/dist/generic/EntitySearchProvider.d.ts.map +1 -0
- package/dist/generic/EntitySearchProvider.js +207 -0
- package/dist/generic/EntitySearchProvider.js.map +1 -0
- package/dist/generic/FullTextSearchProvider.d.ts +35 -0
- package/dist/generic/FullTextSearchProvider.d.ts.map +1 -0
- package/dist/generic/FullTextSearchProvider.js +89 -0
- package/dist/generic/FullTextSearchProvider.js.map +1 -0
- package/dist/generic/ISearchProvider.d.ts +90 -0
- package/dist/generic/ISearchProvider.d.ts.map +1 -0
- package/dist/generic/ISearchProvider.js +62 -0
- package/dist/generic/ISearchProvider.js.map +1 -0
- package/dist/generic/SearchEngine.d.ts +140 -0
- package/dist/generic/SearchEngine.d.ts.map +1 -0
- package/dist/generic/SearchEngine.js +446 -0
- package/dist/generic/SearchEngine.js.map +1 -0
- package/dist/generic/SearchEnricher.d.ts +69 -0
- package/dist/generic/SearchEnricher.d.ts.map +1 -0
- package/dist/generic/SearchEnricher.js +241 -0
- package/dist/generic/SearchEnricher.js.map +1 -0
- package/dist/generic/SearchFusion.d.ts +62 -0
- package/dist/generic/SearchFusion.d.ts.map +1 -0
- package/dist/generic/SearchFusion.js +147 -0
- package/dist/generic/SearchFusion.js.map +1 -0
- package/dist/generic/StorageSearchProvider.d.ts +87 -0
- package/dist/generic/StorageSearchProvider.d.ts.map +1 -0
- package/dist/generic/StorageSearchProvider.js +322 -0
- package/dist/generic/StorageSearchProvider.js.map +1 -0
- package/dist/generic/VectorSearchProvider.d.ts +65 -0
- package/dist/generic/VectorSearchProvider.d.ts.map +1 -0
- package/dist/generic/VectorSearchProvider.js +347 -0
- package/dist/generic/VectorSearchProvider.js.map +1 -0
- package/dist/generic/search.types.d.ts +151 -0
- package/dist/generic/search.types.d.ts.map +1 -0
- package/dist/generic/search.types.js +11 -0
- package/dist/generic/search.types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -7
- package/README.md +0 -45
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Vector similarity search provider for the SearchEngine.
|
|
3
|
+
*
|
|
4
|
+
* Searches ALL configured vector indexes by grouping them by embedding model,
|
|
5
|
+
* embedding the query once per model, then querying all indexes for that model
|
|
6
|
+
* in parallel. Gracefully returns empty results when no vector indexes are
|
|
7
|
+
* configured.
|
|
8
|
+
*
|
|
9
|
+
* @module @memberjunction/search-engine
|
|
10
|
+
*/
|
|
11
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
12
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
13
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
14
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
15
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
16
|
+
};
|
|
17
|
+
var VectorSearchProvider_1;
|
|
18
|
+
import { LogError, LogStatus, Metadata, RunView, CompositeKey } from '@memberjunction/core';
|
|
19
|
+
import { AIEngine } from '@memberjunction/aiengine';
|
|
20
|
+
import { BaseEmbeddings, GetAIAPIKey } from '@memberjunction/ai';
|
|
21
|
+
import { VectorDBBase } from '@memberjunction/ai-vectordb';
|
|
22
|
+
import { MJGlobal, RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
23
|
+
import { BaseSearchProvider } from './ISearchProvider.js';
|
|
24
|
+
let VectorSearchProvider = class VectorSearchProvider extends BaseSearchProvider {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
this.SourceType = 'vector';
|
|
28
|
+
this.available = false;
|
|
29
|
+
}
|
|
30
|
+
static { VectorSearchProvider_1 = this; }
|
|
31
|
+
/** LRU cache for query embeddings. Key = `${modelDriverClass}::${query}`, Value = embedding vector */
|
|
32
|
+
static { this.EmbeddingCache = new Map(); }
|
|
33
|
+
static { this.CACHE_MAX_SIZE = 200; }
|
|
34
|
+
static { this.CACHE_TTL_MS = 5 * 60 * 1000; } // 5 minutes
|
|
35
|
+
/**
|
|
36
|
+
* Check and cache availability. Requires at least one vector index to be
|
|
37
|
+
* configured. Called by SearchEngine during Config().
|
|
38
|
+
*/
|
|
39
|
+
async CheckAvailability(contextUser) {
|
|
40
|
+
try {
|
|
41
|
+
const rv = new RunView();
|
|
42
|
+
const result = await rv.RunView({
|
|
43
|
+
EntityName: 'MJ: Vector Indexes',
|
|
44
|
+
Fields: ['ID'],
|
|
45
|
+
MaxRows: 1,
|
|
46
|
+
ResultType: 'simple'
|
|
47
|
+
}, contextUser);
|
|
48
|
+
this.available = result.Success && result.Results.length > 0;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
this.available = false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
IsAvailable() {
|
|
55
|
+
return this.available;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Search all vector indexes. Groups indexes by embedding model, embeds the
|
|
59
|
+
* query once per model, then queries all indexes for that model in parallel.
|
|
60
|
+
*/
|
|
61
|
+
async Search(query, topK, filters, contextUser) {
|
|
62
|
+
try {
|
|
63
|
+
await AIEngine.Instance.Config(false, contextUser);
|
|
64
|
+
const rv = new RunView();
|
|
65
|
+
const indexResult = await rv.RunView({
|
|
66
|
+
EntityName: 'MJ: Vector Indexes',
|
|
67
|
+
ResultType: 'entity_object'
|
|
68
|
+
}, contextUser);
|
|
69
|
+
if (!indexResult.Success || indexResult.Results.length === 0) {
|
|
70
|
+
LogStatus('VectorSearchProvider: No vector indexes configured');
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const indexesByModel = this.groupIndexesByModel(indexResult.Results);
|
|
74
|
+
const metadataFilter = this.buildMetadataFilter(filters);
|
|
75
|
+
// For each model group: embed + query all indexes in parallel
|
|
76
|
+
const modelGroupPromises = Array.from(indexesByModel.entries()).map(([embeddingModelID, indexes]) => this.embedAndQueryGroup(query, embeddingModelID, indexes, topK, metadataFilter, contextUser));
|
|
77
|
+
const groupResults = await Promise.all(modelGroupPromises);
|
|
78
|
+
return groupResults.flat();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
82
|
+
LogError(`VectorSearchProvider: Search failed: ${msg}`);
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ────────────────────────────────────────────────────────────────
|
|
87
|
+
// Embedding cache helpers
|
|
88
|
+
// ────────────────────────────────────────────────────────────────
|
|
89
|
+
/** Retrieve a cached embedding if present and not expired, promoting it for LRU */
|
|
90
|
+
getCachedEmbedding(key) {
|
|
91
|
+
const entry = VectorSearchProvider_1.EmbeddingCache.get(key);
|
|
92
|
+
if (entry && (Date.now() - entry.timestamp) < VectorSearchProvider_1.CACHE_TTL_MS) {
|
|
93
|
+
// Promote to most-recently-used by re-inserting
|
|
94
|
+
VectorSearchProvider_1.EmbeddingCache.delete(key);
|
|
95
|
+
VectorSearchProvider_1.EmbeddingCache.set(key, entry);
|
|
96
|
+
return entry.vector;
|
|
97
|
+
}
|
|
98
|
+
// Expired or not found — clean up stale entry if present
|
|
99
|
+
if (entry)
|
|
100
|
+
VectorSearchProvider_1.EmbeddingCache.delete(key);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
/** Store an embedding in the cache, evicting the oldest entry if at capacity */
|
|
104
|
+
setCachedEmbedding(key, vector) {
|
|
105
|
+
// Evict least-recently-used (first key in insertion order) if at capacity
|
|
106
|
+
if (VectorSearchProvider_1.EmbeddingCache.size >= VectorSearchProvider_1.CACHE_MAX_SIZE) {
|
|
107
|
+
const oldestKey = VectorSearchProvider_1.EmbeddingCache.keys().next().value;
|
|
108
|
+
if (oldestKey !== undefined)
|
|
109
|
+
VectorSearchProvider_1.EmbeddingCache.delete(oldestKey);
|
|
110
|
+
}
|
|
111
|
+
VectorSearchProvider_1.EmbeddingCache.set(key, { vector, timestamp: Date.now() });
|
|
112
|
+
}
|
|
113
|
+
// ────────────────────────────────────────────────────────────────
|
|
114
|
+
// Private helpers
|
|
115
|
+
// ────────────────────────────────────────────────────────────────
|
|
116
|
+
/** Group vector indexes by their EmbeddingModelID */
|
|
117
|
+
groupIndexesByModel(indexes) {
|
|
118
|
+
const groups = new Map();
|
|
119
|
+
for (const index of indexes) {
|
|
120
|
+
const modelId = index.EmbeddingModelID;
|
|
121
|
+
const existing = groups.get(modelId);
|
|
122
|
+
if (existing) {
|
|
123
|
+
existing.push(index);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
groups.set(modelId, [index]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return groups;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Embed query with one model, then query all indexes for that model in parallel.
|
|
133
|
+
*/
|
|
134
|
+
async embedAndQueryGroup(query, embeddingModelID, indexes, topK, filter, contextUser) {
|
|
135
|
+
try {
|
|
136
|
+
const model = AIEngine.Instance.Models.find(m => UUIDsEqual(m.ID, embeddingModelID));
|
|
137
|
+
if (!model) {
|
|
138
|
+
LogError(`VectorSearchProvider: Embedding model ${embeddingModelID} not found`);
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const apiKey = GetAIAPIKey(model.DriverClass);
|
|
142
|
+
// Check embedding cache before calling the model
|
|
143
|
+
const cacheKey = `${model.DriverClass}::${query}`;
|
|
144
|
+
let queryVector = this.getCachedEmbedding(cacheKey);
|
|
145
|
+
if (queryVector) {
|
|
146
|
+
LogStatus(`VectorSearchProvider: Embedding cache hit for model ${model.Name}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const embeddingInstance = MJGlobal.Instance.ClassFactory.CreateInstance(BaseEmbeddings, model.DriverClass, apiKey);
|
|
150
|
+
if (!embeddingInstance) {
|
|
151
|
+
LogError(`VectorSearchProvider: Failed to create embedding for ${model.DriverClass}`);
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
const embedResult = await embeddingInstance.EmbedText({ text: query, model: '' });
|
|
155
|
+
if (!embedResult?.vector?.length) {
|
|
156
|
+
LogError(`VectorSearchProvider: Failed to embed with ${model.Name}`);
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
queryVector = embedResult.vector;
|
|
160
|
+
this.setCachedEmbedding(cacheKey, queryVector);
|
|
161
|
+
}
|
|
162
|
+
const indexPromises = indexes.map(vectorIndex => this.queryOneIndex(vectorIndex, queryVector, topK, filter, contextUser)
|
|
163
|
+
.catch(error => {
|
|
164
|
+
LogError(`VectorSearchProvider: Error querying index "${vectorIndex.Name}": ${error}`);
|
|
165
|
+
return [];
|
|
166
|
+
}));
|
|
167
|
+
const indexResults = await Promise.all(indexPromises);
|
|
168
|
+
return indexResults.flat();
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
LogError(`VectorSearchProvider: Error in embedding group ${embeddingModelID}: ${error}`);
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Query a single vector index.
|
|
177
|
+
*/
|
|
178
|
+
async queryOneIndex(vectorIndex, queryVector, topK, filter, contextUser) {
|
|
179
|
+
const rv = new RunView();
|
|
180
|
+
const dbResult = await rv.RunView({
|
|
181
|
+
EntityName: 'MJ: Vector Databases',
|
|
182
|
+
ExtraFilter: `ID='${vectorIndex.VectorDatabaseID}'`,
|
|
183
|
+
ResultType: 'entity_object'
|
|
184
|
+
}, contextUser);
|
|
185
|
+
if (!dbResult.Success || dbResult.Results.length === 0) {
|
|
186
|
+
LogError(`VectorSearchProvider: VectorDatabase not found for index "${vectorIndex.Name}"`);
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
const vectorDB = dbResult.Results[0];
|
|
190
|
+
const apiKey = GetAIAPIKey(vectorDB.ClassKey);
|
|
191
|
+
const vectorDBInstance = MJGlobal.Instance.ClassFactory.CreateInstance(VectorDBBase, vectorDB.ClassKey, apiKey);
|
|
192
|
+
if (!vectorDBInstance) {
|
|
193
|
+
LogError(`VectorSearchProvider: Failed to create VectorDB instance for "${vectorDB.ClassKey}"`);
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
const response = await vectorDBInstance.QueryIndex({
|
|
197
|
+
id: vectorIndex.Name,
|
|
198
|
+
vector: queryVector,
|
|
199
|
+
topK,
|
|
200
|
+
includeMetadata: true,
|
|
201
|
+
filter,
|
|
202
|
+
});
|
|
203
|
+
if (!response.success || !response.data?.matches) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
return this.convertMatches(response.data.matches, vectorIndex.Name);
|
|
207
|
+
}
|
|
208
|
+
/** Convert vector DB matches to SearchResultItem[] */
|
|
209
|
+
convertMatches(matches, indexName) {
|
|
210
|
+
return matches.map(match => {
|
|
211
|
+
const meta = match.metadata ?? {};
|
|
212
|
+
const entityName = meta['Entity'] ?? 'Unknown';
|
|
213
|
+
// Vector metadata stores RecordID in CompositeKey URL format: "FieldName|Value" or "F1|V1||F2|V2"
|
|
214
|
+
// Use CompositeKey to properly parse it, then extract just the values for consistent
|
|
215
|
+
// matching with entity search results (which use plain record IDs)
|
|
216
|
+
const rawRecordID = meta['RecordID'] ?? match.id;
|
|
217
|
+
const recordID = this.extractRecordIDFromCompositeKey(rawRecordID);
|
|
218
|
+
const title = this.extractDisplayTitle(meta, entityName);
|
|
219
|
+
const snippet = this.extractDisplaySnippet(meta, indexName, match.score);
|
|
220
|
+
const entityIcon = meta['EntityIcon'] || undefined;
|
|
221
|
+
const updatedAt = meta['__mj_UpdatedAt'] ? new Date(meta['__mj_UpdatedAt']) : new Date();
|
|
222
|
+
const metaTags = Array.isArray(meta['Tags']) ? meta['Tags'] : [];
|
|
223
|
+
const rawScore = match.score ?? 0;
|
|
224
|
+
return {
|
|
225
|
+
ID: recordID,
|
|
226
|
+
EntityName: entityName,
|
|
227
|
+
RecordID: recordID,
|
|
228
|
+
SourceType: 'vector',
|
|
229
|
+
ResultType: 'entity-record',
|
|
230
|
+
Title: title,
|
|
231
|
+
Snippet: snippet,
|
|
232
|
+
Score: rawScore,
|
|
233
|
+
ScoreBreakdown: { Vector: rawScore },
|
|
234
|
+
Tags: metaTags,
|
|
235
|
+
EntityIcon: entityIcon,
|
|
236
|
+
RecordName: title,
|
|
237
|
+
MatchedAt: updatedAt,
|
|
238
|
+
RawMetadata: JSON.stringify(meta),
|
|
239
|
+
};
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Extract best display title from vector metadata using entity field metadata.
|
|
244
|
+
* Combines all IsNameField fields in Sequence order.
|
|
245
|
+
*/
|
|
246
|
+
extractDisplayTitle(meta, fallbackEntity) {
|
|
247
|
+
const entityName = meta['Entity'];
|
|
248
|
+
if (entityName) {
|
|
249
|
+
const md = new Metadata();
|
|
250
|
+
const entityInfo = md.Entities.find(e => e.Name === entityName);
|
|
251
|
+
if (entityInfo) {
|
|
252
|
+
const nameFields = entityInfo.Fields
|
|
253
|
+
.filter(f => f.IsNameField)
|
|
254
|
+
.sort((a, b) => (a.Sequence ?? 9999) - (b.Sequence ?? 9999));
|
|
255
|
+
if (nameFields.length > 0) {
|
|
256
|
+
const parts = nameFields
|
|
257
|
+
.map(f => meta[f.Name])
|
|
258
|
+
.filter(v => v != null && String(v).trim() !== '')
|
|
259
|
+
.map(v => String(v));
|
|
260
|
+
if (parts.length > 0)
|
|
261
|
+
return parts.join(' ');
|
|
262
|
+
}
|
|
263
|
+
if (entityInfo.NameField && meta[entityInfo.NameField.Name]) {
|
|
264
|
+
return String(meta[entityInfo.NameField.Name]);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const heuristicFields = ['Name', 'Title', 'Subject', 'Label', 'DisplayName'];
|
|
269
|
+
for (const field of heuristicFields) {
|
|
270
|
+
if (meta[field] && typeof meta[field] === 'string') {
|
|
271
|
+
return meta[field];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return `${fallbackEntity} Record`;
|
|
275
|
+
}
|
|
276
|
+
/** Extract best display snippet from vector metadata */
|
|
277
|
+
extractDisplaySnippet(meta, indexName, score) {
|
|
278
|
+
const descFields = ['Description', 'Summary', 'Body', 'Content', 'Text', 'Notes'];
|
|
279
|
+
for (const field of descFields) {
|
|
280
|
+
if (meta[field] && typeof meta[field] === 'string') {
|
|
281
|
+
const val = meta[field];
|
|
282
|
+
return val.length > 200 ? val.substring(0, 200) + '...' : val;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const skipFields = new Set(['RecordID', 'Entity', 'TemplateID', 'EntityIcon', '__mj_UpdatedAt']);
|
|
286
|
+
const parts = [];
|
|
287
|
+
for (const [key, val] of Object.entries(meta)) {
|
|
288
|
+
if (skipFields.has(key) || val == null)
|
|
289
|
+
continue;
|
|
290
|
+
const strVal = String(val);
|
|
291
|
+
if (strVal.length > 0 && strVal.length < 100) {
|
|
292
|
+
parts.push(`${key}: ${strVal}`);
|
|
293
|
+
}
|
|
294
|
+
if (parts.length >= 3)
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
if (parts.length > 0)
|
|
298
|
+
return parts.join(' · ');
|
|
299
|
+
return `Matched from index "${indexName}" with score ${(score ?? 0).toFixed(4)}`;
|
|
300
|
+
}
|
|
301
|
+
/** Build metadata filter from SearchFilters for vector DB queries */
|
|
302
|
+
buildMetadataFilter(filters) {
|
|
303
|
+
if (!filters)
|
|
304
|
+
return undefined;
|
|
305
|
+
const conditions = [];
|
|
306
|
+
if (filters.EntityNames?.length) {
|
|
307
|
+
conditions.push({ Entity: { $in: filters.EntityNames } });
|
|
308
|
+
}
|
|
309
|
+
if (filters.SourceTypes?.length) {
|
|
310
|
+
conditions.push({ SourceType: { $in: filters.SourceTypes } });
|
|
311
|
+
}
|
|
312
|
+
if (filters.Tags?.length) {
|
|
313
|
+
conditions.push({ Tags: { $in: filters.Tags } });
|
|
314
|
+
}
|
|
315
|
+
if (conditions.length === 0)
|
|
316
|
+
return undefined;
|
|
317
|
+
if (conditions.length === 1)
|
|
318
|
+
return conditions[0];
|
|
319
|
+
return { $and: conditions };
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Extract a plain record ID from a CompositeKey URL segment string.
|
|
323
|
+
* Vector metadata stores RecordID in format "FieldName|Value" or "F1|V1||F2|V2".
|
|
324
|
+
* For deduplication with entity search results, we need just the value(s).
|
|
325
|
+
* Uses CompositeKey.SimpleLoadFromURLSegment for proper multi-field parsing.
|
|
326
|
+
*/
|
|
327
|
+
extractRecordIDFromCompositeKey(raw) {
|
|
328
|
+
if (!raw.includes('|')) {
|
|
329
|
+
return raw; // Already a plain ID (no composite key format)
|
|
330
|
+
}
|
|
331
|
+
const ck = new CompositeKey();
|
|
332
|
+
ck.SimpleLoadFromURLSegment(raw);
|
|
333
|
+
if (ck.KeyValuePairs.length === 0) {
|
|
334
|
+
return raw; // Parsing failed, return as-is
|
|
335
|
+
}
|
|
336
|
+
if (ck.KeyValuePairs.length === 1) {
|
|
337
|
+
return ck.KeyValuePairs[0].Value; // Single-key: just the UUID
|
|
338
|
+
}
|
|
339
|
+
// Multi-key: join values with || for consistent dedup key
|
|
340
|
+
return ck.KeyValuePairs.map(kv => kv.Value).join('||');
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
VectorSearchProvider = VectorSearchProvider_1 = __decorate([
|
|
344
|
+
RegisterClass(BaseSearchProvider, 'VectorSearchProvider')
|
|
345
|
+
], VectorSearchProvider);
|
|
346
|
+
export { VectorSearchProvider };
|
|
347
|
+
//# sourceMappingURL=VectorSearchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorSearchProvider.js","sourceRoot":"","sources":["../../src/generic/VectorSearchProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core type definitions for the SearchEngine package.
|
|
3
|
+
*
|
|
4
|
+
* Defines request/response types, filters, and result structures used
|
|
5
|
+
* throughout the search engine for vector, full-text, and entity search
|
|
6
|
+
* with Reciprocal Rank Fusion.
|
|
7
|
+
*
|
|
8
|
+
* @module @memberjunction/search-engine
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Source types that can contribute to search results.
|
|
12
|
+
*/
|
|
13
|
+
export type SearchSource = 'vector' | 'fulltext' | 'entity' | 'storage';
|
|
14
|
+
/**
|
|
15
|
+
* Discriminator for how a search result should be rendered in the UI.
|
|
16
|
+
* - 'entity-record': A record from an MJ entity (navigable via EntityRecord viewer)
|
|
17
|
+
* - 'storage-file': A file from a file storage provider (open externally)
|
|
18
|
+
* - 'content-item': A content item (articles, web pages, etc.)
|
|
19
|
+
*/
|
|
20
|
+
export type SearchResultType = 'entity-record' | 'storage-file' | 'content-item';
|
|
21
|
+
/**
|
|
22
|
+
* Search modes that control the level of enrichment applied to results.
|
|
23
|
+
* - 'full': Apply all enrichment (icons, record names, tags)
|
|
24
|
+
* - 'preview': Skip enrichment for faster results (e.g., autocomplete)
|
|
25
|
+
*/
|
|
26
|
+
export type SearchMode = 'full' | 'preview';
|
|
27
|
+
/**
|
|
28
|
+
* Per-source score breakdown for a search result.
|
|
29
|
+
*/
|
|
30
|
+
export interface SearchScoreBreakdown {
|
|
31
|
+
/** Score from vector similarity search */
|
|
32
|
+
Vector?: number;
|
|
33
|
+
/** Score from full-text search */
|
|
34
|
+
FullText?: number;
|
|
35
|
+
/** Score from entity LIKE-based search */
|
|
36
|
+
Entity?: number;
|
|
37
|
+
/** Score from file storage search */
|
|
38
|
+
Storage?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Filters that can be applied to narrow search results.
|
|
42
|
+
*/
|
|
43
|
+
export interface SearchFilters {
|
|
44
|
+
/** Restrict to specific entity names */
|
|
45
|
+
EntityNames?: string[];
|
|
46
|
+
/** Restrict to specific source types (vector metadata filter) */
|
|
47
|
+
SourceTypes?: string[];
|
|
48
|
+
/** Require specific tags */
|
|
49
|
+
Tags?: string[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parameters for executing a search.
|
|
53
|
+
*/
|
|
54
|
+
export interface SearchParams {
|
|
55
|
+
/** The search query text */
|
|
56
|
+
Query: string;
|
|
57
|
+
/** Maximum number of results to return (default: 20) */
|
|
58
|
+
MaxResults?: number;
|
|
59
|
+
/** Optional filters to narrow results */
|
|
60
|
+
Filters?: SearchFilters;
|
|
61
|
+
/** Minimum score threshold (0-1). Results below this are excluded after RRF fusion. */
|
|
62
|
+
MinScore?: number;
|
|
63
|
+
/** Search mode: 'full' applies enrichment, 'preview' skips it for speed */
|
|
64
|
+
Mode?: SearchMode;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A single search result with provenance and scoring information.
|
|
68
|
+
*/
|
|
69
|
+
export interface SearchResultItem {
|
|
70
|
+
/** Primary key of the source record (same as RecordID) */
|
|
71
|
+
ID: string;
|
|
72
|
+
/** The entity this result came from */
|
|
73
|
+
EntityName: string;
|
|
74
|
+
/** The source record ID */
|
|
75
|
+
RecordID: string;
|
|
76
|
+
/** How the content was sourced: 'vector', 'fulltext', 'entity', or 'fused' */
|
|
77
|
+
SourceType: string;
|
|
78
|
+
/** Display title for the result */
|
|
79
|
+
Title: string;
|
|
80
|
+
/** Text snippet showing the relevant content */
|
|
81
|
+
Snippet: string;
|
|
82
|
+
/** Fused relevance score (higher is more relevant) */
|
|
83
|
+
Score: number;
|
|
84
|
+
/** Per-source score breakdown */
|
|
85
|
+
ScoreBreakdown: SearchScoreBreakdown;
|
|
86
|
+
/** Tags associated with this result */
|
|
87
|
+
Tags: string[];
|
|
88
|
+
/** Font Awesome icon class for the entity */
|
|
89
|
+
EntityIcon?: string;
|
|
90
|
+
/** Resolved display name for the record */
|
|
91
|
+
RecordName?: string;
|
|
92
|
+
/** When this result was matched */
|
|
93
|
+
MatchedAt: Date;
|
|
94
|
+
/** Raw vector metadata as JSON string (contains all entity fields stored in vector DB) */
|
|
95
|
+
RawMetadata?: string;
|
|
96
|
+
/** Discriminator for UI rendering: entity-record, storage-file, or content-item */
|
|
97
|
+
ResultType: SearchResultType;
|
|
98
|
+
/** ID of the SearchProvider metadata record that produced this result */
|
|
99
|
+
ProviderId?: string;
|
|
100
|
+
/** Display label from the SearchProvider metadata (e.g., "Database", "Semantic Search") */
|
|
101
|
+
ProviderLabel?: string;
|
|
102
|
+
/** Font Awesome icon class from the SearchProvider metadata (e.g., "fa-solid fa-brain") */
|
|
103
|
+
ProviderIcon?: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Aggregate result from the search engine.
|
|
107
|
+
*/
|
|
108
|
+
export interface SearchResult {
|
|
109
|
+
/** Whether the search completed successfully */
|
|
110
|
+
Success: boolean;
|
|
111
|
+
/** The ranked search results */
|
|
112
|
+
Results: SearchResultItem[];
|
|
113
|
+
/** Total number of results returned */
|
|
114
|
+
TotalCount: number;
|
|
115
|
+
/** Total search execution time in milliseconds */
|
|
116
|
+
ElapsedMs: number;
|
|
117
|
+
/** Count of results contributed by each source before fusion */
|
|
118
|
+
SourceCounts: {
|
|
119
|
+
Vector: number;
|
|
120
|
+
FullText: number;
|
|
121
|
+
Entity: number;
|
|
122
|
+
Storage: number;
|
|
123
|
+
};
|
|
124
|
+
/** Metadata for all active search providers (for UI filter facets and labels) */
|
|
125
|
+
Providers: SearchProviderInfo[];
|
|
126
|
+
/** Error message if Success is false */
|
|
127
|
+
ErrorMessage?: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Metadata about an active search provider, sent to the client for UI rendering.
|
|
131
|
+
*/
|
|
132
|
+
export interface SearchProviderInfo {
|
|
133
|
+
/** SearchProvider record ID */
|
|
134
|
+
ID: string;
|
|
135
|
+
/** Provider name from metadata */
|
|
136
|
+
Name: string;
|
|
137
|
+
/** UI display label (falls back to Name if null) */
|
|
138
|
+
DisplayName: string;
|
|
139
|
+
/** Font Awesome icon class */
|
|
140
|
+
Icon: string;
|
|
141
|
+
/** The SourceType key this provider uses */
|
|
142
|
+
SourceType: string;
|
|
143
|
+
/** Priority (lower = higher) */
|
|
144
|
+
Priority: number;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* A scored candidate used for RRF fusion input/output.
|
|
148
|
+
* Re-exported from @memberjunction/core for convenience.
|
|
149
|
+
*/
|
|
150
|
+
export type { ScoredCandidate } from '@memberjunction/core';
|
|
151
|
+
//# sourceMappingURL=search.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.types.d.ts","sourceRoot":"","sources":["../../src/generic/search.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Core type definitions for the SearchEngine package.
|
|
3
|
+
*
|
|
4
|
+
* Defines request/response types, filters, and result structures used
|
|
5
|
+
* throughout the search engine for vector, full-text, and entity search
|
|
6
|
+
* with Reciprocal Rank Fusion.
|
|
7
|
+
*
|
|
8
|
+
* @module @memberjunction/search-engine
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=search.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.types.js","sourceRoot":"","sources":["../../src/generic/search.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './generic/search.types.js';
|
|
2
|
+
export * from './generic/ISearchProvider.js';
|
|
3
|
+
export * from './generic/SearchFusion.js';
|
|
4
|
+
export * from './generic/SearchEnricher.js';
|
|
5
|
+
export * from './generic/EntitySearchProvider.js';
|
|
6
|
+
export * from './generic/VectorSearchProvider.js';
|
|
7
|
+
export * from './generic/FullTextSearchProvider.js';
|
|
8
|
+
export * from './generic/StorageSearchProvider.js';
|
|
9
|
+
export * from './generic/SearchEngine.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './generic/search.types.js';
|
|
2
|
+
export * from './generic/ISearchProvider.js';
|
|
3
|
+
export * from './generic/SearchFusion.js';
|
|
4
|
+
export * from './generic/SearchEnricher.js';
|
|
5
|
+
export * from './generic/EntitySearchProvider.js';
|
|
6
|
+
export * from './generic/VectorSearchProvider.js';
|
|
7
|
+
export * from './generic/FullTextSearchProvider.js';
|
|
8
|
+
export * from './generic/StorageSearchProvider.js';
|
|
9
|
+
export * from './generic/SearchEngine.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/search-engine",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "5.25.0",
|
|
5
|
+
"description": "MemberJunction: Reusable server-side search engine - vector + full-text + entity search with RRF fusion",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"/dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc && tsc-alias -f",
|
|
13
|
+
"test": "vitest run",
|
|
14
|
+
"test:watch": "vitest"
|
|
15
|
+
},
|
|
16
|
+
"author": "MemberJunction.com",
|
|
17
|
+
"license": "ISC",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@memberjunction/ai": "5.25.0",
|
|
20
|
+
"@memberjunction/ai-vectordb": "5.25.0",
|
|
21
|
+
"@memberjunction/aiengine": "5.25.0",
|
|
22
|
+
"@memberjunction/core": "5.25.0",
|
|
23
|
+
"@memberjunction/core-entities": "5.25.0",
|
|
24
|
+
"@memberjunction/global": "5.25.0",
|
|
25
|
+
"@memberjunction/storage": "5.25.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "24.10.11",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/MemberJunction/MJ"
|
|
34
|
+
}
|
|
10
35
|
}
|