@danielsimonjr/memoryjs 1.0.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/LICENSE +22 -0
- package/README.md +266 -0
- package/dist/core/EntityManager.d.ts +268 -0
- package/dist/core/EntityManager.d.ts.map +1 -0
- package/dist/core/EntityManager.js +512 -0
- package/dist/core/EntityManager.js.map +1 -0
- package/dist/core/GraphEventEmitter.d.ts +202 -0
- package/dist/core/GraphEventEmitter.d.ts.map +1 -0
- package/dist/core/GraphEventEmitter.js +347 -0
- package/dist/core/GraphEventEmitter.js.map +1 -0
- package/dist/core/GraphStorage.d.ts +395 -0
- package/dist/core/GraphStorage.d.ts.map +1 -0
- package/dist/core/GraphStorage.js +786 -0
- package/dist/core/GraphStorage.js.map +1 -0
- package/dist/core/GraphTraversal.d.ts +141 -0
- package/dist/core/GraphTraversal.d.ts.map +1 -0
- package/dist/core/GraphTraversal.js +574 -0
- package/dist/core/GraphTraversal.js.map +1 -0
- package/dist/core/HierarchyManager.d.ts +111 -0
- package/dist/core/HierarchyManager.d.ts.map +1 -0
- package/dist/core/HierarchyManager.js +225 -0
- package/dist/core/HierarchyManager.js.map +1 -0
- package/dist/core/ManagerContext.d.ts +76 -0
- package/dist/core/ManagerContext.d.ts.map +1 -0
- package/dist/core/ManagerContext.js +129 -0
- package/dist/core/ManagerContext.js.map +1 -0
- package/dist/core/ObservationManager.d.ts +85 -0
- package/dist/core/ObservationManager.d.ts.map +1 -0
- package/dist/core/ObservationManager.js +124 -0
- package/dist/core/ObservationManager.js.map +1 -0
- package/dist/core/RelationManager.d.ts +131 -0
- package/dist/core/RelationManager.d.ts.map +1 -0
- package/dist/core/RelationManager.js +212 -0
- package/dist/core/RelationManager.js.map +1 -0
- package/dist/core/SQLiteStorage.d.ts +354 -0
- package/dist/core/SQLiteStorage.d.ts.map +1 -0
- package/dist/core/SQLiteStorage.js +919 -0
- package/dist/core/SQLiteStorage.js.map +1 -0
- package/dist/core/StorageFactory.d.ts +45 -0
- package/dist/core/StorageFactory.d.ts.map +1 -0
- package/dist/core/StorageFactory.js +65 -0
- package/dist/core/StorageFactory.js.map +1 -0
- package/dist/core/TransactionManager.d.ts +464 -0
- package/dist/core/TransactionManager.d.ts.map +1 -0
- package/dist/core/TransactionManager.js +869 -0
- package/dist/core/TransactionManager.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/features/AnalyticsManager.d.ts +44 -0
- package/dist/features/AnalyticsManager.d.ts.map +1 -0
- package/dist/features/AnalyticsManager.js +224 -0
- package/dist/features/AnalyticsManager.js.map +1 -0
- package/dist/features/ArchiveManager.d.ts +133 -0
- package/dist/features/ArchiveManager.d.ts.map +1 -0
- package/dist/features/ArchiveManager.js +282 -0
- package/dist/features/ArchiveManager.js.map +1 -0
- package/dist/features/CompressionManager.d.ts +119 -0
- package/dist/features/CompressionManager.d.ts.map +1 -0
- package/dist/features/CompressionManager.js +470 -0
- package/dist/features/CompressionManager.js.map +1 -0
- package/dist/features/IOManager.d.ts +225 -0
- package/dist/features/IOManager.d.ts.map +1 -0
- package/dist/features/IOManager.js +1093 -0
- package/dist/features/IOManager.js.map +1 -0
- package/dist/features/KeywordExtractor.d.ts +61 -0
- package/dist/features/KeywordExtractor.d.ts.map +1 -0
- package/dist/features/KeywordExtractor.js +127 -0
- package/dist/features/KeywordExtractor.js.map +1 -0
- package/dist/features/ObservationNormalizer.d.ts +90 -0
- package/dist/features/ObservationNormalizer.d.ts.map +1 -0
- package/dist/features/ObservationNormalizer.js +194 -0
- package/dist/features/ObservationNormalizer.js.map +1 -0
- package/dist/features/StreamingExporter.d.ts +128 -0
- package/dist/features/StreamingExporter.d.ts.map +1 -0
- package/dist/features/StreamingExporter.js +212 -0
- package/dist/features/StreamingExporter.js.map +1 -0
- package/dist/features/TagManager.d.ts +147 -0
- package/dist/features/TagManager.d.ts.map +1 -0
- package/dist/features/TagManager.js +211 -0
- package/dist/features/TagManager.js.map +1 -0
- package/dist/features/index.d.ts +14 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +15 -0
- package/dist/features/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/search/BM25Search.d.ts +148 -0
- package/dist/search/BM25Search.d.ts.map +1 -0
- package/dist/search/BM25Search.js +340 -0
- package/dist/search/BM25Search.js.map +1 -0
- package/dist/search/BasicSearch.d.ts +51 -0
- package/dist/search/BasicSearch.d.ts.map +1 -0
- package/dist/search/BasicSearch.js +138 -0
- package/dist/search/BasicSearch.js.map +1 -0
- package/dist/search/BooleanSearch.d.ts +98 -0
- package/dist/search/BooleanSearch.d.ts.map +1 -0
- package/dist/search/BooleanSearch.js +431 -0
- package/dist/search/BooleanSearch.js.map +1 -0
- package/dist/search/EarlyTerminationManager.d.ts +140 -0
- package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
- package/dist/search/EarlyTerminationManager.js +280 -0
- package/dist/search/EarlyTerminationManager.js.map +1 -0
- package/dist/search/EmbeddingCache.d.ts +175 -0
- package/dist/search/EmbeddingCache.d.ts.map +1 -0
- package/dist/search/EmbeddingCache.js +247 -0
- package/dist/search/EmbeddingCache.js.map +1 -0
- package/dist/search/EmbeddingService.d.ts +277 -0
- package/dist/search/EmbeddingService.d.ts.map +1 -0
- package/dist/search/EmbeddingService.js +531 -0
- package/dist/search/EmbeddingService.js.map +1 -0
- package/dist/search/FuzzySearch.d.ts +118 -0
- package/dist/search/FuzzySearch.d.ts.map +1 -0
- package/dist/search/FuzzySearch.js +313 -0
- package/dist/search/FuzzySearch.js.map +1 -0
- package/dist/search/HybridScorer.d.ts +181 -0
- package/dist/search/HybridScorer.d.ts.map +1 -0
- package/dist/search/HybridScorer.js +258 -0
- package/dist/search/HybridScorer.js.map +1 -0
- package/dist/search/HybridSearchManager.d.ts +80 -0
- package/dist/search/HybridSearchManager.d.ts.map +1 -0
- package/dist/search/HybridSearchManager.js +188 -0
- package/dist/search/HybridSearchManager.js.map +1 -0
- package/dist/search/IncrementalIndexer.d.ts +201 -0
- package/dist/search/IncrementalIndexer.d.ts.map +1 -0
- package/dist/search/IncrementalIndexer.js +343 -0
- package/dist/search/IncrementalIndexer.js.map +1 -0
- package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
- package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
- package/dist/search/OptimizedInvertedIndex.js +359 -0
- package/dist/search/OptimizedInvertedIndex.js.map +1 -0
- package/dist/search/ParallelSearchExecutor.d.ts +172 -0
- package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
- package/dist/search/ParallelSearchExecutor.js +310 -0
- package/dist/search/ParallelSearchExecutor.js.map +1 -0
- package/dist/search/QuantizedVectorStore.d.ts +171 -0
- package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
- package/dist/search/QuantizedVectorStore.js +308 -0
- package/dist/search/QuantizedVectorStore.js.map +1 -0
- package/dist/search/QueryAnalyzer.d.ts +76 -0
- package/dist/search/QueryAnalyzer.d.ts.map +1 -0
- package/dist/search/QueryAnalyzer.js +228 -0
- package/dist/search/QueryAnalyzer.js.map +1 -0
- package/dist/search/QueryCostEstimator.d.ts +244 -0
- package/dist/search/QueryCostEstimator.d.ts.map +1 -0
- package/dist/search/QueryCostEstimator.js +653 -0
- package/dist/search/QueryCostEstimator.js.map +1 -0
- package/dist/search/QueryPlanCache.d.ts +220 -0
- package/dist/search/QueryPlanCache.d.ts.map +1 -0
- package/dist/search/QueryPlanCache.js +380 -0
- package/dist/search/QueryPlanCache.js.map +1 -0
- package/dist/search/QueryPlanner.d.ts +58 -0
- package/dist/search/QueryPlanner.d.ts.map +1 -0
- package/dist/search/QueryPlanner.js +138 -0
- package/dist/search/QueryPlanner.js.map +1 -0
- package/dist/search/RankedSearch.d.ts +71 -0
- package/dist/search/RankedSearch.d.ts.map +1 -0
- package/dist/search/RankedSearch.js +239 -0
- package/dist/search/RankedSearch.js.map +1 -0
- package/dist/search/ReflectionManager.d.ts +120 -0
- package/dist/search/ReflectionManager.d.ts.map +1 -0
- package/dist/search/ReflectionManager.js +232 -0
- package/dist/search/ReflectionManager.js.map +1 -0
- package/dist/search/SavedSearchManager.d.ts +79 -0
- package/dist/search/SavedSearchManager.d.ts.map +1 -0
- package/dist/search/SavedSearchManager.js +147 -0
- package/dist/search/SavedSearchManager.js.map +1 -0
- package/dist/search/SearchFilterChain.d.ts +120 -0
- package/dist/search/SearchFilterChain.d.ts.map +1 -0
- package/dist/search/SearchFilterChain.js +186 -0
- package/dist/search/SearchFilterChain.js.map +1 -0
- package/dist/search/SearchManager.d.ts +326 -0
- package/dist/search/SearchManager.d.ts.map +1 -0
- package/dist/search/SearchManager.js +454 -0
- package/dist/search/SearchManager.js.map +1 -0
- package/dist/search/SearchSuggestions.d.ts +27 -0
- package/dist/search/SearchSuggestions.d.ts.map +1 -0
- package/dist/search/SearchSuggestions.js +58 -0
- package/dist/search/SearchSuggestions.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +149 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +324 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/search/SymbolicSearch.d.ts +61 -0
- package/dist/search/SymbolicSearch.d.ts.map +1 -0
- package/dist/search/SymbolicSearch.js +164 -0
- package/dist/search/SymbolicSearch.js.map +1 -0
- package/dist/search/TFIDFEventSync.d.ts +85 -0
- package/dist/search/TFIDFEventSync.d.ts.map +1 -0
- package/dist/search/TFIDFEventSync.js +134 -0
- package/dist/search/TFIDFEventSync.js.map +1 -0
- package/dist/search/TFIDFIndexManager.d.ts +151 -0
- package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
- package/dist/search/TFIDFIndexManager.js +433 -0
- package/dist/search/TFIDFIndexManager.js.map +1 -0
- package/dist/search/VectorStore.d.ts +235 -0
- package/dist/search/VectorStore.d.ts.map +1 -0
- package/dist/search/VectorStore.js +312 -0
- package/dist/search/VectorStore.js.map +1 -0
- package/dist/search/index.d.ts +35 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +53 -0
- package/dist/search/index.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/types.d.ts +1811 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +10 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/BatchProcessor.d.ts +271 -0
- package/dist/utils/BatchProcessor.d.ts.map +1 -0
- package/dist/utils/BatchProcessor.js +377 -0
- package/dist/utils/BatchProcessor.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +176 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +306 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/dist/utils/WorkerPoolManager.d.ts +233 -0
- package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
- package/dist/utils/WorkerPoolManager.js +421 -0
- package/dist/utils/WorkerPoolManager.js.map +1 -0
- package/dist/utils/compressedCache.d.ts +221 -0
- package/dist/utils/compressedCache.d.ts.map +1 -0
- package/dist/utils/compressedCache.js +349 -0
- package/dist/utils/compressedCache.js.map +1 -0
- package/dist/utils/compressionUtil.d.ts +214 -0
- package/dist/utils/compressionUtil.d.ts.map +1 -0
- package/dist/utils/compressionUtil.js +248 -0
- package/dist/utils/compressionUtil.js.map +1 -0
- package/dist/utils/constants.d.ts +245 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +253 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/entityUtils.d.ts +379 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +649 -0
- package/dist/utils/entityUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +95 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +146 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatters.d.ts +145 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +133 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/index.d.ts +26 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +88 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/indexes.d.ts +270 -0
- package/dist/utils/indexes.d.ts.map +1 -0
- package/dist/utils/indexes.js +527 -0
- package/dist/utils/indexes.js.map +1 -0
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operationUtils.d.ts +124 -0
- package/dist/utils/operationUtils.d.ts.map +1 -0
- package/dist/utils/operationUtils.js +176 -0
- package/dist/utils/operationUtils.js.map +1 -0
- package/dist/utils/parallelUtils.d.ts +76 -0
- package/dist/utils/parallelUtils.d.ts.map +1 -0
- package/dist/utils/parallelUtils.js +192 -0
- package/dist/utils/parallelUtils.js.map +1 -0
- package/dist/utils/schemas.d.ts +556 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +485 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/searchAlgorithms.d.ts +99 -0
- package/dist/utils/searchAlgorithms.d.ts.map +1 -0
- package/dist/utils/searchAlgorithms.js +168 -0
- package/dist/utils/searchAlgorithms.js.map +1 -0
- package/dist/utils/searchCache.d.ts +108 -0
- package/dist/utils/searchCache.d.ts.map +1 -0
- package/dist/utils/searchCache.js +210 -0
- package/dist/utils/searchCache.js.map +1 -0
- package/dist/utils/taskScheduler.d.ts +294 -0
- package/dist/utils/taskScheduler.d.ts.map +1 -0
- package/dist/utils/taskScheduler.js +487 -0
- package/dist/utils/taskScheduler.js.map +1 -0
- package/dist/workers/index.d.ts +12 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +10 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/levenshteinWorker.d.ts +60 -0
- package/dist/workers/levenshteinWorker.d.ts.map +1 -0
- package/dist/workers/levenshteinWorker.js +99 -0
- package/dist/workers/levenshteinWorker.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quantized Vector Store
|
|
3
|
+
*
|
|
4
|
+
* Phase 12 Sprint 6: 8-bit scalar quantization for 4x vector memory reduction.
|
|
5
|
+
* Uses asymmetric similarity computation for improved accuracy.
|
|
6
|
+
*
|
|
7
|
+
* @module search/QuantizedVectorStore
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_OPTIONS = {
|
|
10
|
+
asymmetric: true,
|
|
11
|
+
minVectorsForQuantization: 100,
|
|
12
|
+
trackAccuracy: false,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Quantized Vector Store with 8-bit scalar quantization.
|
|
16
|
+
*
|
|
17
|
+
* Provides 4x memory reduction while maintaining >95% accuracy
|
|
18
|
+
* using asymmetric similarity computation.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const store = new QuantizedVectorStore();
|
|
23
|
+
*
|
|
24
|
+
* // Add vectors
|
|
25
|
+
* store.add('entity1', [0.1, 0.2, 0.3, ...]);
|
|
26
|
+
* store.add('entity2', [0.4, 0.5, 0.6, ...]);
|
|
27
|
+
*
|
|
28
|
+
* // Search
|
|
29
|
+
* const results = store.search([0.15, 0.25, 0.35, ...], 10);
|
|
30
|
+
*
|
|
31
|
+
* // Get stats
|
|
32
|
+
* const stats = store.getStats();
|
|
33
|
+
* console.log(`Memory reduction: ${stats.memoryReductionRatio}x`);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class QuantizedVectorStore {
|
|
37
|
+
fullPrecisionVectors;
|
|
38
|
+
quantizedVectors;
|
|
39
|
+
quantizationParams = null;
|
|
40
|
+
options;
|
|
41
|
+
isQuantized = false;
|
|
42
|
+
quantizationErrors = [];
|
|
43
|
+
constructor(options) {
|
|
44
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
45
|
+
this.fullPrecisionVectors = new Map();
|
|
46
|
+
this.quantizedVectors = new Map();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Add a vector to the store.
|
|
50
|
+
*
|
|
51
|
+
* @param id - Entity identifier
|
|
52
|
+
* @param vector - Float vector (any dimension, must be consistent)
|
|
53
|
+
*/
|
|
54
|
+
add(id, vector) {
|
|
55
|
+
const float32 = new Float32Array(vector);
|
|
56
|
+
this.fullPrecisionVectors.set(id, float32);
|
|
57
|
+
// Check if we should quantize
|
|
58
|
+
if (!this.isQuantized &&
|
|
59
|
+
this.fullPrecisionVectors.size >= this.options.minVectorsForQuantization) {
|
|
60
|
+
this.quantize();
|
|
61
|
+
}
|
|
62
|
+
else if (this.isQuantized) {
|
|
63
|
+
// Add to quantized store
|
|
64
|
+
const quantized = this.quantizeVector(float32);
|
|
65
|
+
this.quantizedVectors.set(id, quantized);
|
|
66
|
+
// Track error if enabled
|
|
67
|
+
if (this.options.trackAccuracy) {
|
|
68
|
+
const reconstructed = this.dequantizeVector(quantized);
|
|
69
|
+
this.quantizationErrors.push(this.computeError(float32, reconstructed));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Remove a vector from the store.
|
|
75
|
+
*
|
|
76
|
+
* @param id - Entity identifier
|
|
77
|
+
* @returns True if vector was removed
|
|
78
|
+
*/
|
|
79
|
+
remove(id) {
|
|
80
|
+
const existed = this.fullPrecisionVectors.delete(id);
|
|
81
|
+
this.quantizedVectors.delete(id);
|
|
82
|
+
return existed;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if a vector exists.
|
|
86
|
+
*
|
|
87
|
+
* @param id - Entity identifier
|
|
88
|
+
*/
|
|
89
|
+
has(id) {
|
|
90
|
+
return this.fullPrecisionVectors.has(id);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get a vector (dequantized if necessary).
|
|
94
|
+
*
|
|
95
|
+
* @param id - Entity identifier
|
|
96
|
+
* @returns Vector or undefined
|
|
97
|
+
*/
|
|
98
|
+
get(id) {
|
|
99
|
+
const vector = this.fullPrecisionVectors.get(id);
|
|
100
|
+
return vector ? Array.from(vector) : undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Search for similar vectors.
|
|
104
|
+
*
|
|
105
|
+
* @param query - Query vector
|
|
106
|
+
* @param k - Number of results to return
|
|
107
|
+
* @returns Top k similar vectors with scores
|
|
108
|
+
*/
|
|
109
|
+
search(query, k) {
|
|
110
|
+
const queryVector = new Float32Array(query);
|
|
111
|
+
const results = [];
|
|
112
|
+
if (this.isQuantized && this.options.asymmetric) {
|
|
113
|
+
// Asymmetric search: query in full precision, stored vectors quantized
|
|
114
|
+
for (const [id, quantized] of this.quantizedVectors) {
|
|
115
|
+
const reconstructed = this.dequantizeVector(quantized);
|
|
116
|
+
const similarity = this.cosineSimilarity(queryVector, reconstructed);
|
|
117
|
+
results.push({ id, similarity, quantized: true });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Full precision search
|
|
122
|
+
for (const [id, vector] of this.fullPrecisionVectors) {
|
|
123
|
+
const similarity = this.cosineSimilarity(queryVector, vector);
|
|
124
|
+
results.push({ id, similarity, quantized: false });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Sort by similarity descending and take top k
|
|
128
|
+
return results
|
|
129
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
130
|
+
.slice(0, k);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Compute similarity between a query and specific entity.
|
|
134
|
+
*
|
|
135
|
+
* @param query - Query vector
|
|
136
|
+
* @param id - Entity identifier
|
|
137
|
+
* @returns Similarity score or undefined if not found
|
|
138
|
+
*/
|
|
139
|
+
computeSimilarity(query, id) {
|
|
140
|
+
const queryVector = new Float32Array(query);
|
|
141
|
+
if (this.isQuantized && this.options.asymmetric) {
|
|
142
|
+
const quantized = this.quantizedVectors.get(id);
|
|
143
|
+
if (!quantized)
|
|
144
|
+
return undefined;
|
|
145
|
+
const reconstructed = this.dequantizeVector(quantized);
|
|
146
|
+
return this.cosineSimilarity(queryVector, reconstructed);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const vector = this.fullPrecisionVectors.get(id);
|
|
150
|
+
if (!vector)
|
|
151
|
+
return undefined;
|
|
152
|
+
return this.cosineSimilarity(queryVector, vector);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Force quantization of all vectors.
|
|
157
|
+
*/
|
|
158
|
+
quantize() {
|
|
159
|
+
if (this.fullPrecisionVectors.size === 0)
|
|
160
|
+
return;
|
|
161
|
+
// Compute quantization parameters
|
|
162
|
+
this.quantizationParams = this.computeQuantizationParams();
|
|
163
|
+
this.isQuantized = true;
|
|
164
|
+
// Quantize all vectors
|
|
165
|
+
this.quantizedVectors.clear();
|
|
166
|
+
for (const [id, vector] of this.fullPrecisionVectors) {
|
|
167
|
+
const quantized = this.quantizeVector(vector);
|
|
168
|
+
this.quantizedVectors.set(id, quantized);
|
|
169
|
+
// Track error if enabled
|
|
170
|
+
if (this.options.trackAccuracy) {
|
|
171
|
+
const reconstructed = this.dequantizeVector(quantized);
|
|
172
|
+
this.quantizationErrors.push(this.computeError(vector, reconstructed));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get store statistics.
|
|
178
|
+
*/
|
|
179
|
+
getStats() {
|
|
180
|
+
const vectorCount = this.fullPrecisionVectors.size;
|
|
181
|
+
const dimension = this.quantizationParams?.dimension ??
|
|
182
|
+
(vectorCount > 0 ? this.fullPrecisionVectors.values().next().value.length : 0);
|
|
183
|
+
const fullPrecisionBytes = vectorCount * dimension * 4; // Float32
|
|
184
|
+
const quantizedBytes = vectorCount * dimension * 1; // Uint8
|
|
185
|
+
const avgQuantizationError = this.quantizationErrors.length > 0
|
|
186
|
+
? this.quantizationErrors.reduce((a, b) => a + b, 0) / this.quantizationErrors.length
|
|
187
|
+
: 0;
|
|
188
|
+
return {
|
|
189
|
+
vectorCount,
|
|
190
|
+
dimension,
|
|
191
|
+
fullPrecisionBytes,
|
|
192
|
+
quantizedBytes,
|
|
193
|
+
memoryReductionRatio: fullPrecisionBytes > 0 ? fullPrecisionBytes / quantizedBytes : 1,
|
|
194
|
+
avgQuantizationError,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check if store is currently using quantization.
|
|
199
|
+
*/
|
|
200
|
+
isUsingQuantization() {
|
|
201
|
+
return this.isQuantized;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get the number of stored vectors.
|
|
205
|
+
*/
|
|
206
|
+
size() {
|
|
207
|
+
return this.fullPrecisionVectors.size;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Clear all vectors from the store.
|
|
211
|
+
*/
|
|
212
|
+
clear() {
|
|
213
|
+
this.fullPrecisionVectors.clear();
|
|
214
|
+
this.quantizedVectors.clear();
|
|
215
|
+
this.quantizationParams = null;
|
|
216
|
+
this.isQuantized = false;
|
|
217
|
+
this.quantizationErrors = [];
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Export all vectors.
|
|
221
|
+
*/
|
|
222
|
+
export() {
|
|
223
|
+
const result = new Map();
|
|
224
|
+
for (const [id, vector] of this.fullPrecisionVectors) {
|
|
225
|
+
result.set(id, Array.from(vector));
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Import vectors from a map.
|
|
231
|
+
*
|
|
232
|
+
* @param vectors - Map of id to vector
|
|
233
|
+
* @param quantize - Whether to quantize after import
|
|
234
|
+
*/
|
|
235
|
+
import(vectors, quantize = true) {
|
|
236
|
+
for (const [id, vector] of vectors) {
|
|
237
|
+
const float32 = new Float32Array(vector);
|
|
238
|
+
this.fullPrecisionVectors.set(id, float32);
|
|
239
|
+
}
|
|
240
|
+
if (quantize && this.fullPrecisionVectors.size >= this.options.minVectorsForQuantization) {
|
|
241
|
+
this.quantize();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Private methods
|
|
245
|
+
computeQuantizationParams() {
|
|
246
|
+
let min = Infinity;
|
|
247
|
+
let max = -Infinity;
|
|
248
|
+
let dimension = 0;
|
|
249
|
+
for (const vector of this.fullPrecisionVectors.values()) {
|
|
250
|
+
dimension = vector.length;
|
|
251
|
+
for (let i = 0; i < vector.length; i++) {
|
|
252
|
+
if (vector[i] < min)
|
|
253
|
+
min = vector[i];
|
|
254
|
+
if (vector[i] > max)
|
|
255
|
+
max = vector[i];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const scale = (max - min) / 255;
|
|
259
|
+
return { min, max, scale, dimension };
|
|
260
|
+
}
|
|
261
|
+
quantizeVector(vector) {
|
|
262
|
+
if (!this.quantizationParams) {
|
|
263
|
+
throw new Error('Quantization params not initialized');
|
|
264
|
+
}
|
|
265
|
+
const { min, scale } = this.quantizationParams;
|
|
266
|
+
const quantized = new Uint8Array(vector.length);
|
|
267
|
+
for (let i = 0; i < vector.length; i++) {
|
|
268
|
+
// Clamp to 0-255 range
|
|
269
|
+
const normalized = (vector[i] - min) / scale;
|
|
270
|
+
quantized[i] = Math.max(0, Math.min(255, Math.round(normalized)));
|
|
271
|
+
}
|
|
272
|
+
return quantized;
|
|
273
|
+
}
|
|
274
|
+
dequantizeVector(quantized) {
|
|
275
|
+
if (!this.quantizationParams) {
|
|
276
|
+
throw new Error('Quantization params not initialized');
|
|
277
|
+
}
|
|
278
|
+
const { min, scale } = this.quantizationParams;
|
|
279
|
+
const vector = new Float32Array(quantized.length);
|
|
280
|
+
for (let i = 0; i < quantized.length; i++) {
|
|
281
|
+
vector[i] = quantized[i] * scale + min;
|
|
282
|
+
}
|
|
283
|
+
return vector;
|
|
284
|
+
}
|
|
285
|
+
cosineSimilarity(a, b) {
|
|
286
|
+
if (a.length !== b.length)
|
|
287
|
+
return 0;
|
|
288
|
+
let dotProduct = 0;
|
|
289
|
+
let normA = 0;
|
|
290
|
+
let normB = 0;
|
|
291
|
+
for (let i = 0; i < a.length; i++) {
|
|
292
|
+
dotProduct += a[i] * b[i];
|
|
293
|
+
normA += a[i] * a[i];
|
|
294
|
+
normB += b[i] * b[i];
|
|
295
|
+
}
|
|
296
|
+
const denominator = Math.sqrt(normA) * Math.sqrt(normB);
|
|
297
|
+
return denominator === 0 ? 0 : dotProduct / denominator;
|
|
298
|
+
}
|
|
299
|
+
computeError(original, reconstructed) {
|
|
300
|
+
let sumSquaredError = 0;
|
|
301
|
+
for (let i = 0; i < original.length; i++) {
|
|
302
|
+
const diff = original[i] - reconstructed[i];
|
|
303
|
+
sumSquaredError += diff * diff;
|
|
304
|
+
}
|
|
305
|
+
return Math.sqrt(sumSquaredError / original.length);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=QuantizedVectorStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuantizedVectorStore.js","sourceRoot":"","sources":["../../src/search/QuantizedVectorStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Phase 11: Extracts structured information from natural language queries
|
|
5
|
+
* to enable intelligent search planning.
|
|
6
|
+
*
|
|
7
|
+
* @module search/QueryAnalyzer
|
|
8
|
+
*/
|
|
9
|
+
import type { QueryAnalysis } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Query Analyzer extracts structured information from queries.
|
|
12
|
+
*
|
|
13
|
+
* Uses rule-based heuristics for reliable extraction of:
|
|
14
|
+
* - Person names
|
|
15
|
+
* - Location names
|
|
16
|
+
* - Organization names
|
|
17
|
+
* - Temporal references
|
|
18
|
+
* - Question type
|
|
19
|
+
* - Query complexity
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const analyzer = new QueryAnalyzer();
|
|
24
|
+
* const analysis = analyzer.analyze(
|
|
25
|
+
* 'What projects did Alice work on last month?'
|
|
26
|
+
* );
|
|
27
|
+
* // { query: '...', entities: [...], persons: ['Alice'], temporalRange: { relative: 'last month' }, ... }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class QueryAnalyzer {
|
|
31
|
+
private personIndicators;
|
|
32
|
+
private temporalKeywords;
|
|
33
|
+
private questionKeywords;
|
|
34
|
+
/**
|
|
35
|
+
* Analyze a query using rule-based heuristics.
|
|
36
|
+
* Main entry point - returns full QueryAnalysis.
|
|
37
|
+
*/
|
|
38
|
+
analyze(query: string): QueryAnalysis;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate confidence score for the analysis.
|
|
41
|
+
*/
|
|
42
|
+
private calculateConfidence;
|
|
43
|
+
/**
|
|
44
|
+
* Extract person names from query.
|
|
45
|
+
*/
|
|
46
|
+
private extractPersons;
|
|
47
|
+
/**
|
|
48
|
+
* Extract location names from query.
|
|
49
|
+
*/
|
|
50
|
+
private extractLocations;
|
|
51
|
+
/**
|
|
52
|
+
* Extract organization names from query.
|
|
53
|
+
*/
|
|
54
|
+
private extractOrganizations;
|
|
55
|
+
/**
|
|
56
|
+
* Extract temporal range from query.
|
|
57
|
+
*/
|
|
58
|
+
private extractTemporalRange;
|
|
59
|
+
/**
|
|
60
|
+
* Detect the type of question.
|
|
61
|
+
*/
|
|
62
|
+
private detectQuestionType;
|
|
63
|
+
/**
|
|
64
|
+
* Estimate query complexity.
|
|
65
|
+
*/
|
|
66
|
+
private estimateComplexity;
|
|
67
|
+
/**
|
|
68
|
+
* Detect what types of information are being requested.
|
|
69
|
+
*/
|
|
70
|
+
private detectRequiredInfoTypes;
|
|
71
|
+
/**
|
|
72
|
+
* Decompose complex queries into sub-queries.
|
|
73
|
+
*/
|
|
74
|
+
private decomposeQuery;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=QueryAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryAnalyzer.d.ts","sourceRoot":"","sources":["../../src/search/QueryAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAkC,MAAM,mBAAmB,CAAC;AAEvF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,gBAAgB,CAKtB;IACF,OAAO,CAAC,gBAAgB,CAOtB;IAEF;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAiCrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,OAAO,CAAC,cAAc;CAYvB"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Phase 11: Extracts structured information from natural language queries
|
|
5
|
+
* to enable intelligent search planning.
|
|
6
|
+
*
|
|
7
|
+
* @module search/QueryAnalyzer
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Query Analyzer extracts structured information from queries.
|
|
11
|
+
*
|
|
12
|
+
* Uses rule-based heuristics for reliable extraction of:
|
|
13
|
+
* - Person names
|
|
14
|
+
* - Location names
|
|
15
|
+
* - Organization names
|
|
16
|
+
* - Temporal references
|
|
17
|
+
* - Question type
|
|
18
|
+
* - Query complexity
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const analyzer = new QueryAnalyzer();
|
|
23
|
+
* const analysis = analyzer.analyze(
|
|
24
|
+
* 'What projects did Alice work on last month?'
|
|
25
|
+
* );
|
|
26
|
+
* // { query: '...', entities: [...], persons: ['Alice'], temporalRange: { relative: 'last month' }, ... }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export class QueryAnalyzer {
|
|
30
|
+
personIndicators = ['Mr.', 'Mrs.', 'Ms.', 'Dr.', 'Prof.'];
|
|
31
|
+
temporalKeywords = [
|
|
32
|
+
'yesterday', 'today', 'tomorrow',
|
|
33
|
+
'last week', 'last month', 'last year',
|
|
34
|
+
'this week', 'this month', 'this year',
|
|
35
|
+
'next week', 'next month', 'next year',
|
|
36
|
+
];
|
|
37
|
+
questionKeywords = {
|
|
38
|
+
factual: ['what', 'who', 'where', 'which'],
|
|
39
|
+
temporal: ['when', 'how long', 'since', 'until'],
|
|
40
|
+
comparative: ['compare', 'difference', 'vs', 'versus', 'better', 'worse'],
|
|
41
|
+
aggregation: ['how many', 'count', 'total', 'sum', 'average'],
|
|
42
|
+
'multi-hop': ['and then', 'which means', 'therefore', 'related to'],
|
|
43
|
+
conceptual: ['explain', 'why', 'how does', 'what is the meaning', 'understand'],
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Analyze a query using rule-based heuristics.
|
|
47
|
+
* Main entry point - returns full QueryAnalysis.
|
|
48
|
+
*/
|
|
49
|
+
analyze(query) {
|
|
50
|
+
const lowerQuery = query.toLowerCase();
|
|
51
|
+
const persons = this.extractPersons(query);
|
|
52
|
+
const locations = this.extractLocations(query);
|
|
53
|
+
const organizations = this.extractOrganizations(query);
|
|
54
|
+
const questionType = this.detectQuestionType(lowerQuery);
|
|
55
|
+
const complexity = this.estimateComplexity(query);
|
|
56
|
+
// Build entities array from extracted names
|
|
57
|
+
const entities = [
|
|
58
|
+
...persons.map(name => ({ name, type: 'person' })),
|
|
59
|
+
...locations.map(name => ({ name, type: 'location' })),
|
|
60
|
+
...organizations.map(name => ({ name, type: 'organization' })),
|
|
61
|
+
];
|
|
62
|
+
// Calculate confidence based on extraction quality
|
|
63
|
+
const confidence = this.calculateConfidence(entities, complexity, questionType);
|
|
64
|
+
return {
|
|
65
|
+
query,
|
|
66
|
+
entities,
|
|
67
|
+
persons,
|
|
68
|
+
locations,
|
|
69
|
+
organizations,
|
|
70
|
+
temporalRange: this.extractTemporalRange(query) ?? null,
|
|
71
|
+
questionType,
|
|
72
|
+
complexity,
|
|
73
|
+
confidence,
|
|
74
|
+
requiredInfoTypes: this.detectRequiredInfoTypes(lowerQuery),
|
|
75
|
+
subQueries: this.decomposeQuery(query),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Calculate confidence score for the analysis.
|
|
80
|
+
*/
|
|
81
|
+
calculateConfidence(entities, complexity, questionType) {
|
|
82
|
+
let confidence = 0.5;
|
|
83
|
+
// Higher confidence for simple queries
|
|
84
|
+
if (complexity === 'low')
|
|
85
|
+
confidence += 0.3;
|
|
86
|
+
else if (complexity === 'medium')
|
|
87
|
+
confidence += 0.1;
|
|
88
|
+
// Higher confidence when entities are detected
|
|
89
|
+
if (entities.length > 0)
|
|
90
|
+
confidence += 0.1;
|
|
91
|
+
// Lower confidence for conceptual queries (harder to satisfy)
|
|
92
|
+
if (questionType === 'conceptual')
|
|
93
|
+
confidence -= 0.2;
|
|
94
|
+
return Math.max(0, Math.min(1, confidence));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract person names from query.
|
|
98
|
+
*/
|
|
99
|
+
extractPersons(query) {
|
|
100
|
+
const persons = [];
|
|
101
|
+
const words = query.split(/\s+/);
|
|
102
|
+
for (let i = 0; i < words.length; i++) {
|
|
103
|
+
const word = words[i];
|
|
104
|
+
// Check for titles followed by names
|
|
105
|
+
if (this.personIndicators.some(ind => word.startsWith(ind))) {
|
|
106
|
+
if (i + 1 < words.length) {
|
|
107
|
+
persons.push(words[i + 1].replace(/[^a-zA-Z]/g, ''));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Check for capitalized words that might be names
|
|
111
|
+
if (/^[A-Z][a-z]+$/.test(word) && i > 0 && !/^[A-Z]/.test(words[i - 1])) {
|
|
112
|
+
persons.push(word);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return [...new Set(persons)];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Extract location names from query.
|
|
119
|
+
*/
|
|
120
|
+
extractLocations(query) {
|
|
121
|
+
const locationIndicators = ['in', 'at', 'from', 'to', 'near'];
|
|
122
|
+
const locations = [];
|
|
123
|
+
const words = query.split(/\s+/);
|
|
124
|
+
for (let i = 0; i < words.length; i++) {
|
|
125
|
+
if (locationIndicators.includes(words[i].toLowerCase())) {
|
|
126
|
+
if (i + 1 < words.length && /^[A-Z]/.test(words[i + 1])) {
|
|
127
|
+
locations.push(words[i + 1].replace(/[^a-zA-Z]/g, ''));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return [...new Set(locations)];
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Extract organization names from query.
|
|
135
|
+
*/
|
|
136
|
+
extractOrganizations(query) {
|
|
137
|
+
const orgIndicators = ['Inc.', 'Corp.', 'LLC', 'Ltd.', 'Company', 'Co.'];
|
|
138
|
+
const organizations = [];
|
|
139
|
+
for (const indicator of orgIndicators) {
|
|
140
|
+
const regex = new RegExp(`([A-Z][a-zA-Z]*)\\s*${indicator.replace('.', '\\.')}`, 'g');
|
|
141
|
+
const matches = query.match(regex);
|
|
142
|
+
if (matches) {
|
|
143
|
+
organizations.push(...matches);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return [...new Set(organizations)];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Extract temporal range from query.
|
|
150
|
+
*/
|
|
151
|
+
extractTemporalRange(query) {
|
|
152
|
+
const lowerQuery = query.toLowerCase();
|
|
153
|
+
for (const keyword of this.temporalKeywords) {
|
|
154
|
+
if (lowerQuery.includes(keyword)) {
|
|
155
|
+
return { relative: keyword };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Check for date patterns
|
|
159
|
+
const datePattern = /\d{4}-\d{2}-\d{2}/g;
|
|
160
|
+
const dates = query.match(datePattern);
|
|
161
|
+
if (dates && dates.length >= 1) {
|
|
162
|
+
return {
|
|
163
|
+
start: dates[0],
|
|
164
|
+
end: dates.length > 1 ? dates[1] : undefined,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Detect the type of question.
|
|
171
|
+
*/
|
|
172
|
+
detectQuestionType(query) {
|
|
173
|
+
for (const [type, keywords] of Object.entries(this.questionKeywords)) {
|
|
174
|
+
if (keywords.some(kw => query.includes(kw))) {
|
|
175
|
+
return type;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return 'factual';
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Estimate query complexity.
|
|
182
|
+
*/
|
|
183
|
+
estimateComplexity(query) {
|
|
184
|
+
const wordCount = query.split(/\s+/).length;
|
|
185
|
+
const hasConjunctions = /\b(and|or|but|then|therefore)\b/i.test(query);
|
|
186
|
+
const hasMultipleClauses = /[,;]/.test(query);
|
|
187
|
+
if (wordCount > 20 || (hasConjunctions && hasMultipleClauses)) {
|
|
188
|
+
return 'high';
|
|
189
|
+
}
|
|
190
|
+
if (wordCount > 10 || hasConjunctions || hasMultipleClauses) {
|
|
191
|
+
return 'medium';
|
|
192
|
+
}
|
|
193
|
+
return 'low';
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Detect what types of information are being requested.
|
|
197
|
+
*/
|
|
198
|
+
detectRequiredInfoTypes(query) {
|
|
199
|
+
const infoTypes = [];
|
|
200
|
+
if (/\b(who|person|people|name)\b/.test(query))
|
|
201
|
+
infoTypes.push('person');
|
|
202
|
+
if (/\b(where|location|place|city)\b/.test(query))
|
|
203
|
+
infoTypes.push('location');
|
|
204
|
+
if (/\b(when|date|time|year|month)\b/.test(query))
|
|
205
|
+
infoTypes.push('temporal');
|
|
206
|
+
if (/\b(how many|count|number|total)\b/.test(query))
|
|
207
|
+
infoTypes.push('quantity');
|
|
208
|
+
if (/\b(why|reason|because)\b/.test(query))
|
|
209
|
+
infoTypes.push('reason');
|
|
210
|
+
if (/\b(what|which|project|task)\b/.test(query))
|
|
211
|
+
infoTypes.push('entity');
|
|
212
|
+
return infoTypes;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Decompose complex queries into sub-queries.
|
|
216
|
+
*/
|
|
217
|
+
decomposeQuery(query) {
|
|
218
|
+
// Split on conjunctions
|
|
219
|
+
const parts = query.split(/\b(and then|and|but|or)\b/i)
|
|
220
|
+
.map(p => p.trim())
|
|
221
|
+
.filter(p => p && !/^(and then|and|but|or)$/i.test(p));
|
|
222
|
+
if (parts.length > 1) {
|
|
223
|
+
return parts;
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=QueryAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryAnalyzer.js","sourceRoot":"","sources":["../../src/search/QueryAnalyzer.ts"],"names":[],"mappings":"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"}
|