@bhushanpawar/sqldb 1.0.6 → 1.0.8
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/cache/cache-manager.d.ts +18 -1
- package/dist/cache/cache-manager.d.ts.map +1 -1
- package/dist/cache/cache-manager.js +76 -2
- package/dist/cache/cache-manager.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/client.d.ts +55 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +127 -1
- package/dist/client.js.map +1 -1
- package/dist/connection/mariadb.d.ts +15 -0
- package/dist/connection/mariadb.d.ts.map +1 -1
- package/dist/connection/mariadb.js +25 -0
- package/dist/connection/mariadb.js.map +1 -1
- package/dist/discovery/relationship-parser.d.ts.map +1 -1
- package/dist/discovery/relationship-parser.js +8 -1
- package/dist/discovery/relationship-parser.js.map +1 -1
- package/dist/discovery/schema-reader.d.ts +2 -0
- package/dist/discovery/schema-reader.d.ts.map +1 -1
- package/dist/discovery/schema-reader.js +91 -0
- package/dist/discovery/schema-reader.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/query/operations.d.ts +35 -1
- package/dist/query/operations.d.ts.map +1 -1
- package/dist/query/operations.js +307 -4
- package/dist/query/operations.js.map +1 -1
- package/dist/query/query-tracker.d.ts +30 -0
- package/dist/query/query-tracker.d.ts.map +1 -1
- package/dist/query/query-tracker.js +86 -1
- package/dist/query/query-tracker.js.map +1 -1
- package/dist/search/inverted-index-manager.d.ts +76 -0
- package/dist/search/inverted-index-manager.d.ts.map +1 -0
- package/dist/search/inverted-index-manager.js +371 -0
- package/dist/search/inverted-index-manager.js.map +1 -0
- package/dist/search/search-ranker.d.ts +91 -0
- package/dist/search/search-ranker.d.ts.map +1 -0
- package/dist/search/search-ranker.js +281 -0
- package/dist/search/search-ranker.js.map +1 -0
- package/dist/search/tokenizer.d.ts +80 -0
- package/dist/search/tokenizer.d.ts.map +1 -0
- package/dist/search/tokenizer.js +398 -0
- package/dist/search/tokenizer.js.map +1 -0
- package/dist/types/cache.d.ts +16 -0
- package/dist/types/cache.d.ts.map +1 -1
- package/dist/types/cache.js.map +1 -1
- package/dist/types/config.d.ts +10 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +13 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/query.d.ts +4 -0
- package/dist/types/query.d.ts.map +1 -1
- package/dist/types/schema.d.ts +35 -0
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/search.d.ts +223 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +54 -0
- package/dist/types/search.js.map +1 -0
- package/dist/types/warming.d.ts +1 -1
- package/dist/types/warming.d.ts.map +1 -1
- package/dist/utils/case-converter.d.ts +38 -0
- package/dist/utils/case-converter.d.ts.map +1 -0
- package/dist/utils/case-converter.js +90 -0
- package/dist/utils/case-converter.js.map +1 -0
- package/dist/warming/auto-warming-manager.d.ts.map +1 -1
- package/dist/warming/auto-warming-manager.js +5 -0
- package/dist/warming/auto-warming-manager.js.map +1 -1
- package/dist/warming/query-stats-tracker.d.ts.map +1 -1
- package/dist/warming/query-stats-tracker.js +4 -0
- package/dist/warming/query-stats-tracker.js.map +1 -1
- package/package.json +7 -3
- package/dist/best-practice-example.d.ts +0 -35
- package/dist/best-practice-example.d.ts.map +0 -1
- package/dist/best-practice-example.js +0 -171
- package/dist/best-practice-example.js.map +0 -1
- package/dist/db-schema.d.ts +0 -413
- package/dist/db-schema.d.ts.map +0 -1
- package/dist/db-schema.js +0 -1149
- package/dist/db-schema.js.map +0 -1
- package/dist/demo-debug.d.ts +0 -2
- package/dist/demo-debug.d.ts.map +0 -1
- package/dist/demo-debug.js +0 -36
- package/dist/demo-debug.js.map +0 -1
- package/dist/smart-cache/cache/cache-key-builder.d.ts +0 -17
- package/dist/smart-cache/cache/cache-key-builder.d.ts.map +0 -1
- package/dist/smart-cache/cache/cache-key-builder.js +0 -100
- package/dist/smart-cache/cache/cache-key-builder.js.map +0 -1
- package/dist/smart-cache/cache/cache-manager.d.ts +0 -22
- package/dist/smart-cache/cache/cache-manager.d.ts.map +0 -1
- package/dist/smart-cache/cache/cache-manager.js +0 -124
- package/dist/smart-cache/cache/cache-manager.js.map +0 -1
- package/dist/smart-cache/cache/invalidation.d.ts +0 -15
- package/dist/smart-cache/cache/invalidation.d.ts.map +0 -1
- package/dist/smart-cache/cache/invalidation.js +0 -59
- package/dist/smart-cache/cache/invalidation.js.map +0 -1
- package/dist/smart-cache/client.d.ts +0 -36
- package/dist/smart-cache/client.d.ts.map +0 -1
- package/dist/smart-cache/client.js +0 -138
- package/dist/smart-cache/client.js.map +0 -1
- package/dist/smart-cache/connection/mariadb.d.ts +0 -14
- package/dist/smart-cache/connection/mariadb.d.ts.map +0 -1
- package/dist/smart-cache/connection/mariadb.js +0 -82
- package/dist/smart-cache/connection/mariadb.js.map +0 -1
- package/dist/smart-cache/connection/redis.d.ts +0 -20
- package/dist/smart-cache/connection/redis.d.ts.map +0 -1
- package/dist/smart-cache/connection/redis.js +0 -168
- package/dist/smart-cache/connection/redis.js.map +0 -1
- package/dist/smart-cache/discovery/dependency-graph.d.ts +0 -20
- package/dist/smart-cache/discovery/dependency-graph.d.ts.map +0 -1
- package/dist/smart-cache/discovery/dependency-graph.js +0 -89
- package/dist/smart-cache/discovery/dependency-graph.js.map +0 -1
- package/dist/smart-cache/discovery/relationship-parser.d.ts +0 -10
- package/dist/smart-cache/discovery/relationship-parser.d.ts.map +0 -1
- package/dist/smart-cache/discovery/relationship-parser.js +0 -40
- package/dist/smart-cache/discovery/relationship-parser.js.map +0 -1
- package/dist/smart-cache/discovery/schema-reader.d.ts +0 -15
- package/dist/smart-cache/discovery/schema-reader.d.ts.map +0 -1
- package/dist/smart-cache/discovery/schema-reader.js +0 -82
- package/dist/smart-cache/discovery/schema-reader.js.map +0 -1
- package/dist/smart-cache/examples/basic-usage.d.ts +0 -3
- package/dist/smart-cache/examples/basic-usage.d.ts.map +0 -1
- package/dist/smart-cache/examples/basic-usage.js +0 -105
- package/dist/smart-cache/examples/basic-usage.js.map +0 -1
- package/dist/smart-cache/examples/hooks-example.d.ts +0 -3
- package/dist/smart-cache/examples/hooks-example.d.ts.map +0 -1
- package/dist/smart-cache/examples/hooks-example.js +0 -133
- package/dist/smart-cache/examples/hooks-example.js.map +0 -1
- package/dist/smart-cache/examples/relationships-example.d.ts +0 -3
- package/dist/smart-cache/examples/relationships-example.d.ts.map +0 -1
- package/dist/smart-cache/examples/relationships-example.js +0 -88
- package/dist/smart-cache/examples/relationships-example.js.map +0 -1
- package/dist/smart-cache/hooks/hooks-manager.d.ts +0 -22
- package/dist/smart-cache/hooks/hooks-manager.d.ts.map +0 -1
- package/dist/smart-cache/hooks/hooks-manager.js +0 -117
- package/dist/smart-cache/hooks/hooks-manager.js.map +0 -1
- package/dist/smart-cache/index.d.ts +0 -19
- package/dist/smart-cache/index.d.ts.map +0 -1
- package/dist/smart-cache/index.js +0 -49
- package/dist/smart-cache/index.js.map +0 -1
- package/dist/smart-cache/query/operations.d.ts +0 -31
- package/dist/smart-cache/query/operations.d.ts.map +0 -1
- package/dist/smart-cache/query/operations.js +0 -187
- package/dist/smart-cache/query/operations.js.map +0 -1
- package/dist/smart-cache/query/query-builder.d.ts +0 -15
- package/dist/smart-cache/query/query-builder.d.ts.map +0 -1
- package/dist/smart-cache/query/query-builder.js +0 -169
- package/dist/smart-cache/query/query-builder.js.map +0 -1
- package/dist/smart-cache/query/table-proxy.d.ts +0 -11
- package/dist/smart-cache/query/table-proxy.d.ts.map +0 -1
- package/dist/smart-cache/query/table-proxy.js +0 -25
- package/dist/smart-cache/query/table-proxy.js.map +0 -1
- package/dist/smart-cache/types/cache.d.ts +0 -29
- package/dist/smart-cache/types/cache.d.ts.map +0 -1
- package/dist/smart-cache/types/cache.js +0 -10
- package/dist/smart-cache/types/cache.js.map +0 -1
- package/dist/smart-cache/types/config.d.ts +0 -47
- package/dist/smart-cache/types/config.d.ts.map +0 -1
- package/dist/smart-cache/types/config.js +0 -27
- package/dist/smart-cache/types/config.js.map +0 -1
- package/dist/smart-cache/types/query.d.ts +0 -36
- package/dist/smart-cache/types/query.d.ts.map +0 -1
- package/dist/smart-cache/types/query.js +0 -3
- package/dist/smart-cache/types/query.js.map +0 -1
- package/dist/smart-cache/types/schema.d.ts +0 -25
- package/dist/smart-cache/types/schema.d.ts.map +0 -1
- package/dist/smart-cache/types/schema.js +0 -3
- package/dist/smart-cache/types/schema.js.map +0 -1
- package/dist/trial.d.ts +0 -7
- package/dist/trial.d.ts.map +0 -1
- package/dist/trial.js +0 -30
- package/dist/trial.js.map +0 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Search Ranker
|
|
4
|
+
*
|
|
5
|
+
* Implements ranking algorithms for search results:
|
|
6
|
+
* - TF-IDF (Term Frequency - Inverse Document Frequency)
|
|
7
|
+
* - Field boosting (title matches rank higher than description)
|
|
8
|
+
* - Proximity scoring (words closer together rank higher)
|
|
9
|
+
* - Freshness scoring (newer documents rank higher - optional)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SearchRanker = void 0;
|
|
13
|
+
exports.createRanker = createRanker;
|
|
14
|
+
const search_1 = require("../types/search");
|
|
15
|
+
class SearchRanker {
|
|
16
|
+
constructor(weights) {
|
|
17
|
+
this.weights = {
|
|
18
|
+
...search_1.DEFAULT_RANKING_WEIGHTS,
|
|
19
|
+
...weights,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Calculate TF-IDF score for a term in a document
|
|
24
|
+
*
|
|
25
|
+
* TF (Term Frequency): How often does the term appear in this document?
|
|
26
|
+
* IDF (Inverse Document Frequency): How rare is this term across all documents?
|
|
27
|
+
*
|
|
28
|
+
* Formula: TF-IDF = TF * IDF
|
|
29
|
+
* where:
|
|
30
|
+
* TF = (term frequency in document) / (total terms in document)
|
|
31
|
+
* IDF = log((total documents) / (documents containing term))
|
|
32
|
+
*/
|
|
33
|
+
calculateTfIdf(context) {
|
|
34
|
+
const { termFrequency, docFrequency, totalDocs } = context;
|
|
35
|
+
// Term Frequency (TF)
|
|
36
|
+
// Normalize by document length (not available here, so use raw frequency)
|
|
37
|
+
const tf = termFrequency;
|
|
38
|
+
// Inverse Document Frequency (IDF)
|
|
39
|
+
// Add 1 to avoid division by zero
|
|
40
|
+
const idf = Math.log((totalDocs + 1) / (docFrequency + 1));
|
|
41
|
+
return tf * idf;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculate field boost score
|
|
45
|
+
* Fields with higher boost values rank better
|
|
46
|
+
*/
|
|
47
|
+
calculateFieldBoost(fieldBoost) {
|
|
48
|
+
return fieldBoost;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate proximity score
|
|
52
|
+
* Documents where query terms appear close together rank higher
|
|
53
|
+
*/
|
|
54
|
+
calculateProximityScore(proximityScore) {
|
|
55
|
+
return proximityScore || 0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Calculate freshness score (optional)
|
|
59
|
+
* Newer documents rank higher
|
|
60
|
+
*/
|
|
61
|
+
calculateFreshnessScore(createdAt, decayDays = 30) {
|
|
62
|
+
if (!createdAt)
|
|
63
|
+
return 0;
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const ageMs = now - createdAt;
|
|
66
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
67
|
+
// Exponential decay: score decreases as document ages
|
|
68
|
+
// After 30 days, score is ~0.5
|
|
69
|
+
// After 60 days, score is ~0.25
|
|
70
|
+
return Math.exp(-ageDays / decayDays);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Calculate combined score for a document
|
|
74
|
+
*/
|
|
75
|
+
calculateScore(context) {
|
|
76
|
+
const tfIdf = this.calculateTfIdf(context);
|
|
77
|
+
const fieldBoost = this.calculateFieldBoost(context.fieldBoost);
|
|
78
|
+
const proximity = this.calculateProximityScore(context.proximityScore);
|
|
79
|
+
// Combine scores with weights
|
|
80
|
+
let score = tfIdf * this.weights.tfIdfWeight +
|
|
81
|
+
fieldBoost * this.weights.fieldBoostWeight +
|
|
82
|
+
proximity * this.weights.proximityWeight;
|
|
83
|
+
// Normalize to 0-1 range
|
|
84
|
+
score = Math.min(1, score / 10); // Divide by 10 as rough normalization
|
|
85
|
+
return score;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Rank search results by relevance
|
|
89
|
+
*/
|
|
90
|
+
rankResults(results, queryTerms, termStats, totalDocs, fieldBoosts, proximityScores) {
|
|
91
|
+
const scored = [];
|
|
92
|
+
for (const result of results) {
|
|
93
|
+
let totalScore = 0;
|
|
94
|
+
const matchedTerms = [];
|
|
95
|
+
// Calculate score for each query term
|
|
96
|
+
for (const term of queryTerms) {
|
|
97
|
+
const stats = termStats.get(term);
|
|
98
|
+
if (!stats)
|
|
99
|
+
continue;
|
|
100
|
+
const termFreq = stats.termFrequenciesByDoc.get(result.docId);
|
|
101
|
+
if (!termFreq)
|
|
102
|
+
continue;
|
|
103
|
+
matchedTerms.push(term);
|
|
104
|
+
// Calculate score for this term
|
|
105
|
+
const context = {
|
|
106
|
+
term,
|
|
107
|
+
docId: result.docId,
|
|
108
|
+
termFrequency: termFreq,
|
|
109
|
+
docFrequency: stats.docFrequency,
|
|
110
|
+
totalDocs,
|
|
111
|
+
fieldBoost: this.getAverageFieldBoost(fieldBoosts || {}),
|
|
112
|
+
proximityScore: proximityScores?.get(result.docId),
|
|
113
|
+
};
|
|
114
|
+
totalScore += this.calculateScore(context);
|
|
115
|
+
}
|
|
116
|
+
// Average score across all matched terms
|
|
117
|
+
const avgScore = matchedTerms.length > 0 ? totalScore / matchedTerms.length : 0;
|
|
118
|
+
scored.push({
|
|
119
|
+
score: avgScore,
|
|
120
|
+
data: result.data,
|
|
121
|
+
matchedTerms,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Sort by score (highest first)
|
|
125
|
+
scored.sort((a, b) => b.score - a.score);
|
|
126
|
+
return scored;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get average field boost value
|
|
130
|
+
*/
|
|
131
|
+
getAverageFieldBoost(fieldBoosts) {
|
|
132
|
+
const values = Object.values(fieldBoosts);
|
|
133
|
+
if (values.length === 0)
|
|
134
|
+
return 1.0;
|
|
135
|
+
const sum = values.reduce((acc, val) => acc + val, 0);
|
|
136
|
+
return sum / values.length;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Calculate BM25 score (more advanced than TF-IDF)
|
|
140
|
+
*
|
|
141
|
+
* BM25 is a ranking function used by search engines.
|
|
142
|
+
* It's an improvement over TF-IDF with better handling of:
|
|
143
|
+
* - Document length normalization
|
|
144
|
+
* - Term saturation (diminishing returns for high TF)
|
|
145
|
+
*
|
|
146
|
+
* Formula: BM25 = IDF * (TF * (k1 + 1)) / (TF + k1 * (1 - b + b * (docLen / avgDocLen)))
|
|
147
|
+
* where:
|
|
148
|
+
* k1 = term frequency saturation parameter (typical: 1.2-2.0)
|
|
149
|
+
* b = length normalization parameter (typical: 0.75)
|
|
150
|
+
*/
|
|
151
|
+
calculateBM25(termFrequency, docFrequency, totalDocs, docLength, avgDocLength, k1 = 1.5, b = 0.75) {
|
|
152
|
+
// IDF component (same as TF-IDF)
|
|
153
|
+
const idf = Math.log((totalDocs - docFrequency + 0.5) / (docFrequency + 0.5) + 1);
|
|
154
|
+
// TF component with saturation and length normalization
|
|
155
|
+
const numerator = termFrequency * (k1 + 1);
|
|
156
|
+
const denominator = termFrequency + k1 * (1 - b + b * (docLength / avgDocLength));
|
|
157
|
+
const tf = numerator / denominator;
|
|
158
|
+
return idf * tf;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Highlight search terms in text
|
|
162
|
+
*/
|
|
163
|
+
highlightText(text, terms, preTag = '<mark>', postTag = '</mark>', tokenizer) {
|
|
164
|
+
if (!text || terms.length === 0) {
|
|
165
|
+
return text;
|
|
166
|
+
}
|
|
167
|
+
// Create regex pattern for all terms (case-insensitive)
|
|
168
|
+
// Escape special regex characters
|
|
169
|
+
const escapedTerms = terms.map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
170
|
+
// Match whole words only
|
|
171
|
+
const pattern = new RegExp(`\\b(${escapedTerms.join('|')})\\b`, 'gi');
|
|
172
|
+
// Replace matches with highlighted version
|
|
173
|
+
return text.replace(pattern, `${preTag}$1${postTag}`);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Generate text snippet with highlighted terms
|
|
177
|
+
*/
|
|
178
|
+
generateSnippet(text, terms, maxLength = 150, preTag = '<mark>', postTag = '</mark>') {
|
|
179
|
+
if (!text)
|
|
180
|
+
return '';
|
|
181
|
+
// Find first occurrence of any search term
|
|
182
|
+
const lowerText = text.toLowerCase();
|
|
183
|
+
const lowerTerms = terms.map(t => t.toLowerCase());
|
|
184
|
+
let firstIndex = -1;
|
|
185
|
+
for (const term of lowerTerms) {
|
|
186
|
+
const index = lowerText.indexOf(term);
|
|
187
|
+
if (index !== -1 && (firstIndex === -1 || index < firstIndex)) {
|
|
188
|
+
firstIndex = index;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (firstIndex === -1) {
|
|
192
|
+
// No terms found, return start of text
|
|
193
|
+
return text.substring(0, maxLength) + (text.length > maxLength ? '...' : '');
|
|
194
|
+
}
|
|
195
|
+
// Calculate snippet boundaries
|
|
196
|
+
const contextLength = Math.floor((maxLength - 20) / 2);
|
|
197
|
+
let start = Math.max(0, firstIndex - contextLength);
|
|
198
|
+
let end = Math.min(text.length, firstIndex + contextLength);
|
|
199
|
+
// Adjust to word boundaries
|
|
200
|
+
if (start > 0) {
|
|
201
|
+
const spaceIndex = text.lastIndexOf(' ', start);
|
|
202
|
+
if (spaceIndex !== -1)
|
|
203
|
+
start = spaceIndex + 1;
|
|
204
|
+
}
|
|
205
|
+
if (end < text.length) {
|
|
206
|
+
const spaceIndex = text.indexOf(' ', end);
|
|
207
|
+
if (spaceIndex !== -1)
|
|
208
|
+
end = spaceIndex;
|
|
209
|
+
}
|
|
210
|
+
// Extract snippet
|
|
211
|
+
let snippet = text.substring(start, end);
|
|
212
|
+
// Add ellipsis
|
|
213
|
+
if (start > 0)
|
|
214
|
+
snippet = '...' + snippet;
|
|
215
|
+
if (end < text.length)
|
|
216
|
+
snippet = snippet + '...';
|
|
217
|
+
// Highlight terms
|
|
218
|
+
snippet = this.highlightText(snippet, terms, preTag, postTag);
|
|
219
|
+
return snippet;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Calculate proximity between multiple terms in a document
|
|
223
|
+
*/
|
|
224
|
+
calculateMultiTermProximity(tokens, queryTerms) {
|
|
225
|
+
if (queryTerms.length <= 1)
|
|
226
|
+
return 0;
|
|
227
|
+
const positions = new Map();
|
|
228
|
+
// Collect positions for each query term
|
|
229
|
+
for (const token of tokens) {
|
|
230
|
+
if (queryTerms.includes(token.term)) {
|
|
231
|
+
if (!positions.has(token.term)) {
|
|
232
|
+
positions.set(token.term, []);
|
|
233
|
+
}
|
|
234
|
+
positions.get(token.term).push(...token.positions);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// If not all terms found, proximity is 0
|
|
238
|
+
if (positions.size < queryTerms.length) {
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
241
|
+
// Calculate minimum span containing all terms
|
|
242
|
+
const allPositions = Array.from(positions.values());
|
|
243
|
+
let minSpan = Infinity;
|
|
244
|
+
// For each position of the first term
|
|
245
|
+
for (const pos1 of allPositions[0]) {
|
|
246
|
+
// Find closest position of other terms
|
|
247
|
+
let maxDistance = 0;
|
|
248
|
+
for (let i = 1; i < allPositions.length; i++) {
|
|
249
|
+
const positions = allPositions[i];
|
|
250
|
+
// Find closest position to pos1
|
|
251
|
+
let minDistance = Infinity;
|
|
252
|
+
for (const pos of positions) {
|
|
253
|
+
const distance = Math.abs(pos - pos1);
|
|
254
|
+
minDistance = Math.min(minDistance, distance);
|
|
255
|
+
}
|
|
256
|
+
maxDistance = Math.max(maxDistance, minDistance);
|
|
257
|
+
}
|
|
258
|
+
minSpan = Math.min(minSpan, maxDistance);
|
|
259
|
+
}
|
|
260
|
+
// Convert span to score (closer = higher score)
|
|
261
|
+
if (minSpan === 0)
|
|
262
|
+
return 1.0;
|
|
263
|
+
if (minSpan <= 2)
|
|
264
|
+
return 0.9;
|
|
265
|
+
if (minSpan <= 5)
|
|
266
|
+
return 0.7;
|
|
267
|
+
if (minSpan <= 10)
|
|
268
|
+
return 0.5;
|
|
269
|
+
if (minSpan <= 20)
|
|
270
|
+
return 0.3;
|
|
271
|
+
return 0.1;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.SearchRanker = SearchRanker;
|
|
275
|
+
/**
|
|
276
|
+
* Helper function to create ranker with custom weights
|
|
277
|
+
*/
|
|
278
|
+
function createRanker(weights) {
|
|
279
|
+
return new SearchRanker(weights);
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=search-ranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-ranker.js","sourceRoot":"","sources":["../../src/search/search-ranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text Tokenizer
|
|
3
|
+
*
|
|
4
|
+
* Converts text into searchable tokens using various strategies:
|
|
5
|
+
* - Simple: Split by whitespace, lowercase
|
|
6
|
+
* - Stemming: Reduce words to root form (running → run)
|
|
7
|
+
* - N-gram: Split into character sequences (plumb → pl, plu, lum, umb)
|
|
8
|
+
*/
|
|
9
|
+
import { TokenizerOptions, TokenMetadata } from '../types/search';
|
|
10
|
+
export declare class Tokenizer {
|
|
11
|
+
private options;
|
|
12
|
+
constructor(options: Partial<TokenizerOptions>);
|
|
13
|
+
/**
|
|
14
|
+
* Tokenize text into searchable terms
|
|
15
|
+
*/
|
|
16
|
+
tokenize(text: string, field?: string): TokenMetadata[];
|
|
17
|
+
/**
|
|
18
|
+
* Simple tokenization: split by whitespace, lowercase, remove punctuation
|
|
19
|
+
*/
|
|
20
|
+
private tokenizeSimple;
|
|
21
|
+
/**
|
|
22
|
+
* Stemming tokenization: reduce words to root form
|
|
23
|
+
* Uses Porter Stemmer algorithm (simplified)
|
|
24
|
+
*/
|
|
25
|
+
private tokenizeStemming;
|
|
26
|
+
/**
|
|
27
|
+
* N-gram tokenization: split into character sequences
|
|
28
|
+
* Example: "plumb" with n=3 → ["plu", "lum", "umb"]
|
|
29
|
+
*/
|
|
30
|
+
private tokenizeNgram;
|
|
31
|
+
/**
|
|
32
|
+
* Porter Stemmer (simplified version)
|
|
33
|
+
* Reduces words to their root form
|
|
34
|
+
*/
|
|
35
|
+
private stem;
|
|
36
|
+
private step1;
|
|
37
|
+
private step2;
|
|
38
|
+
private step3;
|
|
39
|
+
private step4;
|
|
40
|
+
private step5;
|
|
41
|
+
/**
|
|
42
|
+
* Measure the "size" of a word (number of consonant-vowel sequences)
|
|
43
|
+
*/
|
|
44
|
+
private measureWord;
|
|
45
|
+
/**
|
|
46
|
+
* Check if word contains a vowel
|
|
47
|
+
*/
|
|
48
|
+
private hasVowel;
|
|
49
|
+
/**
|
|
50
|
+
* Check if word ends with consonant-vowel-consonant pattern
|
|
51
|
+
*/
|
|
52
|
+
private endsWithCVC;
|
|
53
|
+
/**
|
|
54
|
+
* Fix word ending after removing suffix
|
|
55
|
+
* Example: "hopping" → "hopp" → "hop"
|
|
56
|
+
*/
|
|
57
|
+
private fixEnding;
|
|
58
|
+
/**
|
|
59
|
+
* Merge duplicate terms and combine their positions
|
|
60
|
+
*/
|
|
61
|
+
private mergePositions;
|
|
62
|
+
/**
|
|
63
|
+
* Get all unique terms from tokens (useful for indexing)
|
|
64
|
+
*/
|
|
65
|
+
getUniqueTerms(tokens: TokenMetadata[]): string[];
|
|
66
|
+
/**
|
|
67
|
+
* Calculate proximity score between terms
|
|
68
|
+
* Terms closer together get higher scores
|
|
69
|
+
*/
|
|
70
|
+
calculateProximity(tokens: TokenMetadata[], term1: string, term2: string): number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Helper function to create tokenizer from config
|
|
74
|
+
*/
|
|
75
|
+
export declare function createTokenizer(type: 'simple' | 'stemming' | 'ngram', options?: Partial<TokenizerOptions>): Tokenizer;
|
|
76
|
+
/**
|
|
77
|
+
* Helper function to tokenize multiple fields
|
|
78
|
+
*/
|
|
79
|
+
export declare function tokenizeFields(tokenizer: Tokenizer, data: Record<string, any>, fields: string[]): TokenMetadata[];
|
|
80
|
+
//# sourceMappingURL=tokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/search/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAC;AAEtF,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAU9C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,aAAa,EAAE;IAiBlE;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAqCrB;;;OAGG;IACH,OAAO,CAAC,IAAI;IAmBZ,OAAO,CAAC,KAAK;IAqCb,OAAO,CAAC,KAAK;IAoCb,OAAO,CAAC,KAAK;IAuBb,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,KAAK;IAkBb;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAuBjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE;IAIjD;;;OAGG;IACH,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CA0BlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,EACrC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAClC,SAAS,CAKX;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,EAAE,MAAM,EAAE,GACf,aAAa,EAAE,CAYjB"}
|