cry-search 2.0.3 → 2.1.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/CLAUDE.md +8 -2
- package/README.md +53 -0
- package/UNIVERSE.md +12 -0
- package/dist/common/numeric/createSearchArrayMetadata.d.ts +10 -0
- package/dist/common/numeric/createSearchArrayMetadata.d.ts.map +1 -1
- package/dist/common/numeric/matchMany.d.ts +111 -0
- package/dist/common/numeric/matchMany.d.ts.map +1 -0
- package/dist/common/numeric/prepareQueryVariants.d.ts +24 -0
- package/dist/common/numeric/prepareQueryVariants.d.ts.map +1 -1
- package/dist/common/numeric/searchAndRank.d.ts.map +1 -1
- package/dist/common/numeric/searchInData.d.ts.map +1 -1
- package/dist/common/numeric/syncSearchArrayMetadata.d.ts.map +1 -1
- package/dist/common/numeric/updateSearchMetadata.d.ts.map +1 -1
- package/dist/index.cjs +300 -113
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +300 -113
- package/dist/types/index.d.ts +65 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/vet/data/enote.d.ts +40 -0
- package/dist/vet/data/enote.d.ts.map +1 -0
- package/dist/vet/data/znamke.gen.d.ts +41 -0
- package/dist/vet/data/znamke.gen.d.ts.map +1 -0
- package/dist/vet/index.cjs +2468 -0
- package/dist/vet/index.d.cts +24 -0
- package/dist/vet/index.d.ts +24 -0
- package/dist/vet/index.d.ts.map +1 -0
- package/dist/vet/index.js +2426 -0
- package/dist/vet/normalizatorji.d.ts +104 -0
- package/dist/vet/normalizatorji.d.ts.map +1 -0
- package/dist/vet/ocena.d.ts +46 -0
- package/dist/vet/ocena.d.ts.map +1 -0
- package/dist/vet/spec.d.ts +35 -0
- package/dist/vet/spec.d.ts.map +1 -0
- package/dist/vet/uparjanje.d.ts +72 -0
- package/dist/vet/uparjanje.d.ts.map +1 -0
- package/package.json +29 -11
package/dist/index.js
CHANGED
|
@@ -426,6 +426,38 @@ function extractStringsFromValue(value, results) {
|
|
|
426
426
|
}
|
|
427
427
|
}
|
|
428
428
|
}
|
|
429
|
+
function applyValueNormalizers(value, field, normalizers) {
|
|
430
|
+
let text = value;
|
|
431
|
+
const classes = {};
|
|
432
|
+
if (!normalizers?.length)
|
|
433
|
+
return { text, classes };
|
|
434
|
+
for (const normalizer of normalizers) {
|
|
435
|
+
if (normalizer.fields && !normalizer.fields.includes(field))
|
|
436
|
+
continue;
|
|
437
|
+
const izhod = normalizer.fn(text, field);
|
|
438
|
+
if (izhod === undefined)
|
|
439
|
+
continue;
|
|
440
|
+
if (typeof izhod === "string") {
|
|
441
|
+
text = izhod;
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
text = izhod.text;
|
|
445
|
+
for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
|
|
446
|
+
const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
|
|
447
|
+
const obstojeci = classes[kljuc] ?? [];
|
|
448
|
+
for (const v of seznam) {
|
|
449
|
+
if (v != null && v !== "" && !obstojeci.includes(String(v)))
|
|
450
|
+
obstojeci.push(String(v));
|
|
451
|
+
}
|
|
452
|
+
classes[kljuc] = obstojeci;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
return { text, classes };
|
|
456
|
+
}
|
|
457
|
+
function itemClasses(metadata, id) {
|
|
458
|
+
const zapis = metadata.classes?.get(id);
|
|
459
|
+
return zapis && Object.keys(zapis).length ? zapis : undefined;
|
|
460
|
+
}
|
|
429
461
|
function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
|
|
430
462
|
if (isDeletedOrBlocked(obj)) {
|
|
431
463
|
return;
|
|
@@ -433,11 +465,12 @@ function prepareObjectForSearchNumeric(obj, spec, tokensMap) {
|
|
|
433
465
|
if (spec?.enrichSearchObjectFn) {
|
|
434
466
|
spec.enrichSearchObjectFn(obj, spec.searchContext);
|
|
435
467
|
}
|
|
436
|
-
const
|
|
468
|
+
const classes = {};
|
|
469
|
+
const sorted = spec?.extractSearchableStringFn ? buildSortedFromExtractFn(obj, spec.extractSearchableStringFn, tokensMap) : buildSortedFromFields(obj, spec, tokensMap, classes);
|
|
437
470
|
if (sorted === undefined)
|
|
438
471
|
return;
|
|
439
|
-
const firstN = spec?.keyFields && spec.keyFields.length > 0 ? buildFirstNFromKeyFields(obj, spec.keyFields, spec.firstTokensN ?? DEFAULT_FIRST_TOKENS_N, spec.phoneFields ?? DEFAULT_PHONE_FIELDS, tokensMap) : undefined;
|
|
440
|
-
return { sorted, firstN };
|
|
472
|
+
const firstN = spec?.keyFields && spec.keyFields.length > 0 ? buildFirstNFromKeyFields(obj, spec.keyFields, spec.firstTokensN ?? DEFAULT_FIRST_TOKENS_N, spec.phoneFields ?? DEFAULT_PHONE_FIELDS, tokensMap, spec.valueNormalizers) : undefined;
|
|
473
|
+
return Object.keys(classes).length ? { sorted, firstN, classes } : { sorted, firstN };
|
|
441
474
|
}
|
|
442
475
|
function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
|
|
443
476
|
const str = extractFn(obj);
|
|
@@ -445,7 +478,7 @@ function buildSortedFromExtractFn(obj, extractFn, tokensMap) {
|
|
|
445
478
|
return;
|
|
446
479
|
return prepareStringForSearchNumeric(str, tokensMap).sorted;
|
|
447
480
|
}
|
|
448
|
-
function buildSortedFromFields(obj, spec, tokensMap) {
|
|
481
|
+
function buildSortedFromFields(obj, spec, tokensMap, classesOut = {}) {
|
|
449
482
|
const allTokens = [];
|
|
450
483
|
const fieldMatchModes = spec?.fieldMatchModes;
|
|
451
484
|
const fieldsToSearch = spec?.searchInFields ?? Object.keys(obj);
|
|
@@ -478,7 +511,19 @@ function buildSortedFromFields(obj, spec, tokensMap) {
|
|
|
478
511
|
}
|
|
479
512
|
if (fieldStrings.length === 0)
|
|
480
513
|
continue;
|
|
481
|
-
const
|
|
514
|
+
const normalizirane = spec?.valueNormalizers?.length ? fieldStrings.map((s) => applyValueNormalizers(s, keyStr, spec.valueNormalizers)) : undefined;
|
|
515
|
+
const fieldText = normalizirane ? normalizirane.map((n) => n.text).join(" ") : fieldStrings.join(" ");
|
|
516
|
+
if (normalizirane) {
|
|
517
|
+
for (const n of normalizirane) {
|
|
518
|
+
for (const [kljuc, vrednosti] of Object.entries(n.classes)) {
|
|
519
|
+
const obstojeci = classesOut[kljuc] ?? [];
|
|
520
|
+
for (const v of vrednosti)
|
|
521
|
+
if (!obstojeci.includes(v))
|
|
522
|
+
obstojeci.push(v);
|
|
523
|
+
classesOut[kljuc] = obstojeci;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
482
527
|
const datesNormalized = normalizeDates(fieldText);
|
|
483
528
|
const preprocessed = preprocessString(datesNormalized);
|
|
484
529
|
const sanitised = sanitiseString(preprocessed);
|
|
@@ -496,7 +541,7 @@ function buildSortedFromFields(obj, spec, tokensMap) {
|
|
|
496
541
|
const uniqueTokens = [...new Set(allTokens)].sort((a, b) => a - b);
|
|
497
542
|
return new Uint32Array(uniqueTokens);
|
|
498
543
|
}
|
|
499
|
-
function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
|
|
544
|
+
function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap, normalizers) {
|
|
500
545
|
const strings = [];
|
|
501
546
|
const phoneFieldPaths = new Set(phoneFields);
|
|
502
547
|
for (const field of keyFields) {
|
|
@@ -506,7 +551,9 @@ function buildFirstNFromKeyFields(obj, keyFields, n, phoneFields, tokensMap) {
|
|
|
506
551
|
const value = isDotNotation(keyStr) ? getValueByPath(obj, keyStr) : obj[field];
|
|
507
552
|
if (value == null)
|
|
508
553
|
continue;
|
|
509
|
-
|
|
554
|
+
const zacasno = [];
|
|
555
|
+
extractStringsFromValue(value, zacasno);
|
|
556
|
+
strings.push(...normalizers?.length ? zacasno.map((s) => applyValueNormalizers(s, keyStr, normalizers).text) : zacasno);
|
|
510
557
|
}
|
|
511
558
|
if (strings.length === 0)
|
|
512
559
|
return;
|
|
@@ -535,6 +582,9 @@ function createSearchArrayMetadataNumeric(data, spec) {
|
|
|
535
582
|
if (result.firstN !== undefined) {
|
|
536
583
|
metadata.unsorted.set(id, result.firstN);
|
|
537
584
|
}
|
|
585
|
+
if (result.classes !== undefined) {
|
|
586
|
+
(metadata.classes ??= new Map).set(id, result.classes);
|
|
587
|
+
}
|
|
538
588
|
}
|
|
539
589
|
}
|
|
540
590
|
return metadata;
|
|
@@ -570,6 +620,7 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
|
|
|
570
620
|
if (result === undefined) {
|
|
571
621
|
metadata.sorted.delete(objectId);
|
|
572
622
|
metadata.unsorted.delete(objectId);
|
|
623
|
+
metadata.classes?.delete(objectId);
|
|
573
624
|
return false;
|
|
574
625
|
}
|
|
575
626
|
metadata.sorted.set(objectId, result.sorted);
|
|
@@ -578,6 +629,11 @@ function updateSearchMetadataNumeric(metadata, objectId, obj, spec, tokensMap) {
|
|
|
578
629
|
} else {
|
|
579
630
|
metadata.unsorted.delete(objectId);
|
|
580
631
|
}
|
|
632
|
+
if (result.classes !== undefined) {
|
|
633
|
+
(metadata.classes ??= new Map).set(objectId, result.classes);
|
|
634
|
+
} else {
|
|
635
|
+
metadata.classes?.delete(objectId);
|
|
636
|
+
}
|
|
581
637
|
return true;
|
|
582
638
|
}
|
|
583
639
|
function updateSearchMetadataBatchNumeric(metadata, batch, spec) {
|
|
@@ -806,20 +862,49 @@ function allTokensMatchNumeric(searchTokenStrs, targetTokens, opts) {
|
|
|
806
862
|
}
|
|
807
863
|
|
|
808
864
|
// src/common/numeric/prepareQueryVariants.ts
|
|
865
|
+
function normalizeQueryWithOpts(query, opts) {
|
|
866
|
+
const normalizers = opts?.queryNormalizers;
|
|
867
|
+
if (!normalizers?.length)
|
|
868
|
+
return { text: query, classes: {} };
|
|
869
|
+
let text = query;
|
|
870
|
+
const classes = {};
|
|
871
|
+
for (const normalizer of normalizers) {
|
|
872
|
+
const fn = typeof normalizer === "function" ? normalizer : normalizer.fn;
|
|
873
|
+
const izhod = fn(text, "");
|
|
874
|
+
if (izhod === undefined)
|
|
875
|
+
continue;
|
|
876
|
+
if (typeof izhod === "string") {
|
|
877
|
+
text = izhod;
|
|
878
|
+
continue;
|
|
879
|
+
}
|
|
880
|
+
text = izhod.text;
|
|
881
|
+
for (const [kljuc, vrednost] of Object.entries(izhod.classes ?? {})) {
|
|
882
|
+
const seznam = Array.isArray(vrednost) ? vrednost : [vrednost];
|
|
883
|
+
const obstojeci = classes[kljuc] ?? [];
|
|
884
|
+
for (const v of seznam) {
|
|
885
|
+
if (v != null && v !== "" && !obstojeci.includes(String(v)))
|
|
886
|
+
obstojeci.push(String(v));
|
|
887
|
+
}
|
|
888
|
+
classes[kljuc] = obstojeci;
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
return { text, classes };
|
|
892
|
+
}
|
|
809
893
|
function prepareQueryVariants(query, opts) {
|
|
810
|
-
const
|
|
894
|
+
const { text: normalizirano, classes } = normalizeQueryWithOpts(query, opts);
|
|
895
|
+
const rawTokenStrs = prepareStringForSearch(normalizirano);
|
|
811
896
|
const rawTokens = prepareQueryTokens(rawTokenStrs);
|
|
812
897
|
const normalizers = opts?.phoneQueryNormalizers ?? [defaultQueryPhoneNormalizer];
|
|
813
898
|
const seenPhones = new Set;
|
|
814
899
|
const phoneTokens = [];
|
|
815
900
|
for (const normalizer of normalizers) {
|
|
816
|
-
const normalized = validateNormalizedPhone(normalizer(
|
|
901
|
+
const normalized = validateNormalizedPhone(normalizer(normalizirano), "Phone query normalizer");
|
|
817
902
|
if (normalized === undefined || seenPhones.has(normalized))
|
|
818
903
|
continue;
|
|
819
904
|
seenPhones.add(normalized);
|
|
820
905
|
phoneTokens.push(prepareQueryTokens([normalized]));
|
|
821
906
|
}
|
|
822
|
-
return { rawTokenStrs, rawTokens, phoneTokens };
|
|
907
|
+
return { rawTokenStrs, rawTokens, phoneTokens, classes };
|
|
823
908
|
}
|
|
824
909
|
|
|
825
910
|
// src/common/numeric/scoring.ts
|
|
@@ -938,12 +1023,13 @@ function searchInDataReturnObjectsNumeric(query, metadata, data, opts) {
|
|
|
938
1023
|
return results;
|
|
939
1024
|
}
|
|
940
1025
|
function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
|
|
941
|
-
const {
|
|
1026
|
+
const { rawTokens, phoneTokens } = prepareQueryVariants(query, opts);
|
|
942
1027
|
const phoneCandidates = findMatchingCandidates(metadata, phoneTokens, opts);
|
|
943
1028
|
const candidates = phoneCandidates.length > 0 ? phoneCandidates : findMatchingCandidates(metadata, rawTokens.length > 0 ? [rawTokens] : [], opts);
|
|
944
1029
|
if (candidates.length === 0)
|
|
945
1030
|
return [];
|
|
946
|
-
const
|
|
1031
|
+
const qText = normalizeQueryWithOpts(query, opts).text;
|
|
1032
|
+
const qTokens = orderedTokenize(qText);
|
|
947
1033
|
const hasUnsorted = metadata.unsorted.size > 0;
|
|
948
1034
|
if (!hasUnsorted) {
|
|
949
1035
|
if (limit === Infinity || limit >= candidates.length)
|
|
@@ -962,7 +1048,7 @@ function searchInDataReturnIdsWithLimitNumeric(query, metadata, limit, opts) {
|
|
|
962
1048
|
for (let j = 0;j < unsortedIds.length; j++) {
|
|
963
1049
|
itemTokens[j] = tokens[unsortedIds[j]] ?? "";
|
|
964
1050
|
}
|
|
965
|
-
scored[i] = { id, score: scoreOne(
|
|
1051
|
+
scored[i] = { id, score: scoreOne(qText, qTokens, itemTokens), order: i };
|
|
966
1052
|
}
|
|
967
1053
|
scored.sort((a, b) => {
|
|
968
1054
|
if (a.score !== b.score)
|
|
@@ -1414,10 +1500,16 @@ function applyPreparedTokens(metadata, id, result) {
|
|
|
1414
1500
|
} else {
|
|
1415
1501
|
metadata.unsorted.delete(id);
|
|
1416
1502
|
}
|
|
1503
|
+
if (result.classes !== undefined) {
|
|
1504
|
+
(metadata.classes ??= new Map).set(id, result.classes);
|
|
1505
|
+
} else {
|
|
1506
|
+
metadata.classes?.delete(id);
|
|
1507
|
+
}
|
|
1417
1508
|
}
|
|
1418
1509
|
function deletePreparedTokens(metadata, id) {
|
|
1419
1510
|
metadata.sorted.delete(id);
|
|
1420
1511
|
metadata.unsorted.delete(id);
|
|
1512
|
+
metadata.classes?.delete(id);
|
|
1421
1513
|
}
|
|
1422
1514
|
function syncSearchArrayMetadataNumeric(metadata, newData, spec) {
|
|
1423
1515
|
const result = {
|
|
@@ -1507,6 +1599,135 @@ function syncSearchArrayMetadataNumericWithPrevious(metadata, previousData, newD
|
|
|
1507
1599
|
clearTokensMap(tokensMap);
|
|
1508
1600
|
return result;
|
|
1509
1601
|
}
|
|
1602
|
+
// src/common/numeric/searchAndRank.ts
|
|
1603
|
+
function tokenIdsToStrings(tokenIds) {
|
|
1604
|
+
if (tokenIds === undefined)
|
|
1605
|
+
return;
|
|
1606
|
+
const out = new Array(tokenIds.length);
|
|
1607
|
+
for (let i = 0;i < tokenIds.length; i++) {
|
|
1608
|
+
out[i] = tokens[tokenIds[i]] ?? "";
|
|
1609
|
+
}
|
|
1610
|
+
return out;
|
|
1611
|
+
}
|
|
1612
|
+
function searchAndRankNumeric(query, data, metadata, options) {
|
|
1613
|
+
const { primaryTextFn, exactKeysFn, limit, opts } = options;
|
|
1614
|
+
const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
|
|
1615
|
+
if (ids.length === 0)
|
|
1616
|
+
return [];
|
|
1617
|
+
const qText = normalizeQueryWithOpts(query, opts).text;
|
|
1618
|
+
const qTokens = orderedTokenize(qText);
|
|
1619
|
+
const scored = [];
|
|
1620
|
+
for (const id of ids) {
|
|
1621
|
+
const item = data.get(id);
|
|
1622
|
+
if (!item)
|
|
1623
|
+
continue;
|
|
1624
|
+
const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
|
|
1625
|
+
const exactKeys = exactKeysFn?.(item);
|
|
1626
|
+
const score = scoreOne(qText, qTokens, itemTokens, exactKeys);
|
|
1627
|
+
scored.push({ id, item, score });
|
|
1628
|
+
}
|
|
1629
|
+
scored.sort((x, y) => {
|
|
1630
|
+
if (y.score !== x.score)
|
|
1631
|
+
return y.score - x.score;
|
|
1632
|
+
const xText = primaryTextFn(x.item) || "";
|
|
1633
|
+
const yText = primaryTextFn(y.item) || "";
|
|
1634
|
+
return xText.localeCompare(yText);
|
|
1635
|
+
});
|
|
1636
|
+
if (limit === undefined || limit === Infinity || limit >= scored.length)
|
|
1637
|
+
return scored;
|
|
1638
|
+
return scored.slice(0, limit);
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
// src/common/numeric/matchMany.ts
|
|
1642
|
+
function naSezname(classes) {
|
|
1643
|
+
if (!classes)
|
|
1644
|
+
return;
|
|
1645
|
+
const out = {};
|
|
1646
|
+
for (const [kljuc, vrednost] of Object.entries(classes)) {
|
|
1647
|
+
const seznam = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
|
|
1648
|
+
if (seznam.length)
|
|
1649
|
+
out[kljuc] = seznam;
|
|
1650
|
+
}
|
|
1651
|
+
return Object.keys(out).length ? out : undefined;
|
|
1652
|
+
}
|
|
1653
|
+
async function* matchMany(prepared, queries, options) {
|
|
1654
|
+
const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
|
|
1655
|
+
const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
|
|
1656
|
+
const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
|
|
1657
|
+
const porabljeni = samoEnolicno ? new Set : undefined;
|
|
1658
|
+
let kosZbirka = [];
|
|
1659
|
+
for (let indeks = 0;indeks < queries.length; indeks++) {
|
|
1660
|
+
const query = queries[indeks];
|
|
1661
|
+
const vhod = queryOf(query);
|
|
1662
|
+
const text = typeof vhod === "string" ? vhod : vhod.text;
|
|
1663
|
+
const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
|
|
1664
|
+
const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
|
|
1665
|
+
const poisciKandidate = (besedilo, razredi) => {
|
|
1666
|
+
if (!besedilo.trim())
|
|
1667
|
+
return { kandidati: [], zadetkov: 0 };
|
|
1668
|
+
const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
|
|
1669
|
+
primaryTextFn: primaryTextOf,
|
|
1670
|
+
...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
|
|
1671
|
+
...opts ? { opts } : {},
|
|
1672
|
+
limit: retrievalLimit
|
|
1673
|
+
});
|
|
1674
|
+
const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
|
|
1675
|
+
const najdeni = [];
|
|
1676
|
+
for (const zadetek of zadetki) {
|
|
1677
|
+
const classes = itemClasses(prepared.metadata, zadetek.id);
|
|
1678
|
+
const kandidat = {
|
|
1679
|
+
id: zadetek.id,
|
|
1680
|
+
item: zadetek.item,
|
|
1681
|
+
...classes ? { classes } : {}
|
|
1682
|
+
};
|
|
1683
|
+
if (accept && !accept(kandidat, poizvedbaZaDomeno))
|
|
1684
|
+
continue;
|
|
1685
|
+
const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
|
|
1686
|
+
if (ocena < minScore)
|
|
1687
|
+
continue;
|
|
1688
|
+
if (porabljeni?.has(zadetek.id))
|
|
1689
|
+
continue;
|
|
1690
|
+
najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
|
|
1691
|
+
}
|
|
1692
|
+
najdeni.sort((a, b) => {
|
|
1693
|
+
if (b.score !== a.score)
|
|
1694
|
+
return b.score - a.score;
|
|
1695
|
+
return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
|
|
1696
|
+
});
|
|
1697
|
+
if (najdeni.length > limit)
|
|
1698
|
+
najdeni.length = limit;
|
|
1699
|
+
return { kandidati: najdeni, zadetkov: zadetki.length };
|
|
1700
|
+
};
|
|
1701
|
+
let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
|
|
1702
|
+
const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
|
|
1703
|
+
if (poskusiAlternative && options.alternativnePoizvedbe) {
|
|
1704
|
+
for (const alternativa of options.alternativnePoizvedbe(query)) {
|
|
1705
|
+
const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
|
|
1706
|
+
if (!altBesedilo?.trim() || altBesedilo === text)
|
|
1707
|
+
continue;
|
|
1708
|
+
const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
|
|
1709
|
+
({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
|
|
1710
|
+
if (kandidati.length)
|
|
1711
|
+
break;
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
if (porabljeni) {
|
|
1715
|
+
for (const kandidat of kandidati)
|
|
1716
|
+
porabljeni.add(kandidat.id);
|
|
1717
|
+
}
|
|
1718
|
+
kosZbirka.push({
|
|
1719
|
+
id,
|
|
1720
|
+
...queryClasses ? { queryClasses } : {},
|
|
1721
|
+
kandidati
|
|
1722
|
+
});
|
|
1723
|
+
if (kosZbirka.length >= kos) {
|
|
1724
|
+
yield kosZbirka;
|
|
1725
|
+
kosZbirka = [];
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
if (kosZbirka.length)
|
|
1729
|
+
yield kosZbirka;
|
|
1730
|
+
}
|
|
1510
1731
|
// src/common/numeric/updateSearchLinkedMetadata.ts
|
|
1511
1732
|
function tokensEqual2(a, b) {
|
|
1512
1733
|
if (a.length !== b.length)
|
|
@@ -1659,43 +1880,6 @@ function syncLinkedItemsForPrimaryNumeric(linked, primaryId, newLinkedItems, for
|
|
|
1659
1880
|
clearTokensMap(tokensMap);
|
|
1660
1881
|
return result;
|
|
1661
1882
|
}
|
|
1662
|
-
// src/common/numeric/searchAndRank.ts
|
|
1663
|
-
function tokenIdsToStrings(tokenIds) {
|
|
1664
|
-
if (tokenIds === undefined)
|
|
1665
|
-
return;
|
|
1666
|
-
const out = new Array(tokenIds.length);
|
|
1667
|
-
for (let i = 0;i < tokenIds.length; i++) {
|
|
1668
|
-
out[i] = tokens[tokenIds[i]] ?? "";
|
|
1669
|
-
}
|
|
1670
|
-
return out;
|
|
1671
|
-
}
|
|
1672
|
-
function searchAndRankNumeric(query, data, metadata, options) {
|
|
1673
|
-
const { primaryTextFn, exactKeysFn, limit, opts } = options;
|
|
1674
|
-
const ids = searchInDataReturnIdsNumeric(query, metadata, opts);
|
|
1675
|
-
if (ids.length === 0)
|
|
1676
|
-
return [];
|
|
1677
|
-
const qTokens = orderedTokenize(query);
|
|
1678
|
-
const scored = [];
|
|
1679
|
-
for (const id of ids) {
|
|
1680
|
-
const item = data.get(id);
|
|
1681
|
-
if (!item)
|
|
1682
|
-
continue;
|
|
1683
|
-
const itemTokens = tokenIdsToStrings(metadata.unsorted.get(id)) ?? orderedTokenize(primaryTextFn(item) || "");
|
|
1684
|
-
const exactKeys = exactKeysFn?.(item);
|
|
1685
|
-
const score = scoreOne(query, qTokens, itemTokens, exactKeys);
|
|
1686
|
-
scored.push({ id, item, score });
|
|
1687
|
-
}
|
|
1688
|
-
scored.sort((x, y) => {
|
|
1689
|
-
if (y.score !== x.score)
|
|
1690
|
-
return y.score - x.score;
|
|
1691
|
-
const xText = primaryTextFn(x.item) || "";
|
|
1692
|
-
const yText = primaryTextFn(y.item) || "";
|
|
1693
|
-
return xText.localeCompare(yText);
|
|
1694
|
-
});
|
|
1695
|
-
if (limit === undefined || limit === Infinity || limit >= scored.length)
|
|
1696
|
-
return scored;
|
|
1697
|
-
return scored.slice(0, limit);
|
|
1698
|
-
}
|
|
1699
1883
|
// src/common/SearchUniverse.ts
|
|
1700
1884
|
function tokensEqual3(a, b) {
|
|
1701
1885
|
if (a.length !== b.length)
|
|
@@ -2137,68 +2321,71 @@ class SearchUniverse {
|
|
|
2137
2321
|
}
|
|
2138
2322
|
}
|
|
2139
2323
|
export {
|
|
2140
|
-
|
|
2141
|
-
upsertLinkedItemNumeric as upsertLinkedItem,
|
|
2142
|
-
updateSearchMetadataBatchNumeric as updateSearchMetadataBatch,
|
|
2143
|
-
updateSearchMetadataNumeric as updateSearchMetadata,
|
|
2144
|
-
tokens,
|
|
2145
|
-
tokenize,
|
|
2146
|
-
syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious,
|
|
2147
|
-
syncSearchArrayMetadataNumeric as syncSearchArrayMetadata,
|
|
2148
|
-
syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary,
|
|
2149
|
-
searchableDataToArray,
|
|
2150
|
-
searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit,
|
|
2151
|
-
searchInDataReturnObjectsNumeric as searchInDataReturnObjects,
|
|
2152
|
-
searchInDataReturnIdsNumeric as searchInDataReturnIds,
|
|
2153
|
-
searchInDataReturnIdsNumeric as searchInData,
|
|
2154
|
-
searchAndRankNumeric,
|
|
2155
|
-
searchAndRankNumeric as searchAndRank,
|
|
2156
|
-
scoreOrderAndPresence,
|
|
2157
|
-
scoreOne,
|
|
2158
|
-
scoreBag,
|
|
2159
|
-
sanitiseString,
|
|
2160
|
-
resolvePhoneQueryNormalizer,
|
|
2161
|
-
resetTokenRegistry,
|
|
2162
|
-
removePrimaryItemNumeric as removePrimaryItem,
|
|
2163
|
-
removeLinkedItemNumeric as removeLinkedItem,
|
|
2164
|
-
removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch,
|
|
2165
|
-
removeFromSearchMetadataNumeric as removeFromSearchMetadata,
|
|
2166
|
-
registerToken,
|
|
2167
|
-
preprocessString,
|
|
2168
|
-
prepareStringForSearch,
|
|
2169
|
-
prepareQueryTokens,
|
|
2170
|
-
prepareObjectForSearchNumeric as prepareObjectForSearch,
|
|
2171
|
-
orderedTokenize,
|
|
2172
|
-
normalizeDates,
|
|
2173
|
-
matchTokenInSortedListNumeric,
|
|
2174
|
-
matchPreparedTokenInSortedList,
|
|
2175
|
-
isDeletedOrBlocked,
|
|
2176
|
-
getTokenCount,
|
|
2177
|
-
getTokenById,
|
|
2178
|
-
getOrCreateTokenId,
|
|
2179
|
-
findTokenId,
|
|
2180
|
-
findInLinkedArraysSimpleNumeric,
|
|
2181
|
-
findInLinkedArraysNumeric,
|
|
2182
|
-
encodeTokenWithMode,
|
|
2183
|
-
defaultQueryPhoneNormalizer,
|
|
2184
|
-
defaultPhoneNormalizer,
|
|
2185
|
-
decodeTokenId,
|
|
2186
|
-
decodeMatchMode,
|
|
2187
|
-
createTokensMap,
|
|
2188
|
-
createSearchLinkedMetadataNumeric as createSearchLinkedMetadata,
|
|
2189
|
-
createSearchArrayMetadataNumeric as createSearchArrayMetadata,
|
|
2190
|
-
compareTokenized,
|
|
2191
|
-
clearTokensMap,
|
|
2192
|
-
binarySearchUint32,
|
|
2193
|
-
arrayToSearchableData,
|
|
2194
|
-
allTokensMatchNumeric,
|
|
2195
|
-
allPreparedTokensMatch,
|
|
2196
|
-
TOKEN_ID_MASK,
|
|
2197
|
-
SearchUniverse,
|
|
2198
|
-
PREFIX_TO_MATCH_MODE,
|
|
2199
|
-
MATCH_MODE_PREFIXES,
|
|
2200
|
-
MATCH_MODE_BITS,
|
|
2201
|
-
DEFAULT_SEARCH_OPTS,
|
|
2324
|
+
AugmentedMetadata,
|
|
2202
2325
|
DEFAULT_PHONE_FIELDS,
|
|
2203
|
-
|
|
2326
|
+
DEFAULT_SEARCH_OPTS,
|
|
2327
|
+
MATCH_MODE_BITS,
|
|
2328
|
+
MATCH_MODE_PREFIXES,
|
|
2329
|
+
PREFIX_TO_MATCH_MODE,
|
|
2330
|
+
SearchUniverse,
|
|
2331
|
+
TOKEN_ID_MASK,
|
|
2332
|
+
allPreparedTokensMatch,
|
|
2333
|
+
allTokensMatchNumeric,
|
|
2334
|
+
arrayToSearchableData,
|
|
2335
|
+
binarySearchUint32,
|
|
2336
|
+
clearTokensMap,
|
|
2337
|
+
compareTokenized,
|
|
2338
|
+
createSearchArrayMetadataNumeric as createSearchArrayMetadata,
|
|
2339
|
+
createSearchLinkedMetadataNumeric as createSearchLinkedMetadata,
|
|
2340
|
+
createTokensMap,
|
|
2341
|
+
decodeMatchMode,
|
|
2342
|
+
decodeTokenId,
|
|
2343
|
+
defaultPhoneNormalizer,
|
|
2344
|
+
defaultQueryPhoneNormalizer,
|
|
2345
|
+
encodeTokenWithMode,
|
|
2346
|
+
findInLinkedArraysNumeric,
|
|
2347
|
+
findInLinkedArraysSimpleNumeric,
|
|
2348
|
+
findTokenId,
|
|
2349
|
+
getOrCreateTokenId,
|
|
2350
|
+
getTokenById,
|
|
2351
|
+
getTokenCount,
|
|
2352
|
+
isDeletedOrBlocked,
|
|
2353
|
+
itemClasses,
|
|
2354
|
+
matchMany,
|
|
2355
|
+
matchPreparedTokenInSortedList,
|
|
2356
|
+
matchTokenInSortedListNumeric,
|
|
2357
|
+
normalizeDates,
|
|
2358
|
+
normalizeQueryWithOpts,
|
|
2359
|
+
orderedTokenize,
|
|
2360
|
+
prepareObjectForSearchNumeric as prepareObjectForSearch,
|
|
2361
|
+
prepareQueryTokens,
|
|
2362
|
+
prepareStringForSearch,
|
|
2363
|
+
preprocessString,
|
|
2364
|
+
registerToken,
|
|
2365
|
+
removeFromSearchMetadataNumeric as removeFromSearchMetadata,
|
|
2366
|
+
removeFromSearchMetadataBatchNumeric as removeFromSearchMetadataBatch,
|
|
2367
|
+
removeLinkedItemNumeric as removeLinkedItem,
|
|
2368
|
+
removePrimaryItemNumeric as removePrimaryItem,
|
|
2369
|
+
resetTokenRegistry,
|
|
2370
|
+
resolvePhoneQueryNormalizer,
|
|
2371
|
+
sanitiseString,
|
|
2372
|
+
scoreBag,
|
|
2373
|
+
scoreOne,
|
|
2374
|
+
scoreOrderAndPresence,
|
|
2375
|
+
searchAndRankNumeric as searchAndRank,
|
|
2376
|
+
searchAndRankNumeric,
|
|
2377
|
+
searchInDataReturnIdsNumeric as searchInData,
|
|
2378
|
+
searchInDataReturnIdsNumeric as searchInDataReturnIds,
|
|
2379
|
+
searchInDataReturnObjectsNumeric as searchInDataReturnObjects,
|
|
2380
|
+
searchInDataReturnIdsWithLimitNumeric as searchInDataWithLimit,
|
|
2381
|
+
searchableDataToArray,
|
|
2382
|
+
syncLinkedItemsForPrimaryNumeric as syncLinkedItemsForPrimary,
|
|
2383
|
+
syncSearchArrayMetadataNumeric as syncSearchArrayMetadata,
|
|
2384
|
+
syncSearchArrayMetadataNumericWithPrevious as syncSearchArrayMetadataWithPrevious,
|
|
2385
|
+
tokenize,
|
|
2386
|
+
tokens,
|
|
2387
|
+
updateSearchMetadataNumeric as updateSearchMetadata,
|
|
2388
|
+
updateSearchMetadataBatchNumeric as updateSearchMetadataBatch,
|
|
2389
|
+
upsertLinkedItemNumeric as upsertLinkedItem,
|
|
2390
|
+
upsertPrimaryItemNumeric as upsertPrimaryItem
|
|
2204
2391
|
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -27,6 +27,17 @@ export interface NumericSearchMetadata {
|
|
|
27
27
|
sorted: Map<Id, NumericTokenSortedList>;
|
|
28
28
|
/** First-N token IDs in SOURCE order per item — used for positional ranking. */
|
|
29
29
|
unsorted: Map<Id, NumericTokenUnsortedList>;
|
|
30
|
+
/**
|
|
31
|
+
* Domain classes per item, produced by `SearchableObjectSpec.valueNormalizers`
|
|
32
|
+
* (e.g. `{ razpon: ['15-30'], enota: ['tbl'] }`).
|
|
33
|
+
*
|
|
34
|
+
* Classes are **not tokens**: they never take part in retrieval, so a candidate
|
|
35
|
+
* missing a class is never excluded. They exist so a domain scorer can reward
|
|
36
|
+
* equal class values and penalize conflicting ones (soft semantics).
|
|
37
|
+
*
|
|
38
|
+
* Absent when no normalizer produced classes.
|
|
39
|
+
*/
|
|
40
|
+
classes?: Map<Id, Record<string, string[]>>;
|
|
30
41
|
}
|
|
31
42
|
/** Map of objects by their ID for efficient lookup */
|
|
32
43
|
export type SearchableData<T extends SearchableObject> = Map<Id, T>;
|
|
@@ -97,7 +108,55 @@ export interface SearchableObjectSpec<T extends SearchableObject, C = unknown> {
|
|
|
97
108
|
* @default 8
|
|
98
109
|
*/
|
|
99
110
|
firstTokensN?: number;
|
|
111
|
+
/**
|
|
112
|
+
* Domain normalizers applied to FIELD VALUES at index time, before the standard
|
|
113
|
+
* pipeline (dates → preprocess → sanitise → tokenize) and before `fieldMatchModes`.
|
|
114
|
+
*
|
|
115
|
+
* A normalizer either returns a replacement string (canonical units, brand aliases)
|
|
116
|
+
* or a {@link NormalizedValue} carrying extra **domain classes** (a range, a pack
|
|
117
|
+
* size, an animal species). Classes are stored in `metadata.classes` and are never
|
|
118
|
+
* required for a match — see {@link NumericSearchMetadata.classes}.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* valueNormalizers: [{ fn: (v) => v.replace(/\btablete?\b/gi, 'tbl') }]
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
valueNormalizers?: readonly ValueNormalizer[];
|
|
100
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Result of a domain normalizer: canonical text plus optional domain classes.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* { text: '15 30 KG', classes: { razpon: '15-30' } }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export interface NormalizedValue {
|
|
136
|
+
/** Canonical (replacement) text that continues through the normal pipeline. */
|
|
137
|
+
text: string;
|
|
138
|
+
/** Domain classes; a single value or a list (both become a list in metadata). */
|
|
139
|
+
classes?: Record<string, string | string[]>;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Index-time normalizer for a field value (domain extension seam).
|
|
143
|
+
*
|
|
144
|
+
* Returning `undefined` keeps the previous text; normalizers run in order, so a
|
|
145
|
+
* later one sees the previous one's replacement (but not its classes).
|
|
146
|
+
*/
|
|
147
|
+
export interface ValueNormalizer {
|
|
148
|
+
/** Fields this normalizer applies to. Default: every searched field. */
|
|
149
|
+
fields?: readonly string[];
|
|
150
|
+
fn: (value: string, field: string) => string | NormalizedValue | undefined;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Query-time normalizer (domain extension seam). Must be the same mapping as the
|
|
154
|
+
* index-time one, otherwise query tokens and stored tokens drift apart.
|
|
155
|
+
*
|
|
156
|
+
* Accepts either a plain function or the same `{ fn }` shape as
|
|
157
|
+
* {@link ValueNormalizer}, so one definition can be reused on both sides.
|
|
158
|
+
*/
|
|
159
|
+
export type QueryNormalizer = ((query: string) => string | NormalizedValue | undefined) | ValueNormalizer;
|
|
101
160
|
/** Default cap on `metadata.unsorted` length. */
|
|
102
161
|
export declare const DEFAULT_FIRST_TOKENS_N = 8;
|
|
103
162
|
/**
|
|
@@ -134,6 +193,12 @@ export interface SearchOpts {
|
|
|
134
193
|
* When a phone variant finds candidates, it takes precedence over raw tokens.
|
|
135
194
|
*/
|
|
136
195
|
phoneQueryNormalizers?: readonly PhoneQueryNormalizer[];
|
|
196
|
+
/**
|
|
197
|
+
* Domain normalizers applied to the QUERY before tokenization; the same mapping
|
|
198
|
+
* must be configured as `SearchableObjectSpec.valueNormalizers` at index time.
|
|
199
|
+
* Query classes are available to the caller through {@link normalizeQueryWithOpts}.
|
|
200
|
+
*/
|
|
201
|
+
queryNormalizers?: readonly QueryNormalizer[];
|
|
137
202
|
}
|
|
138
203
|
/** Default match-mode options. Phone query normalizers are resolved per search. */
|
|
139
204
|
export declare const DEFAULT_SEARCH_OPTS: Required<Pick<SearchOpts, 'matchWords' | 'matchNumbers' | 'matchNumbersShort' | 'matchNumbersThreshold'>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA;;GAEG;AAMH,+CAA+C;AAC/C,MAAM,MAAM,EAAE,GAAG,MAAM,CAAC;AAExB,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,2DAA2D;AAC3D,MAAM,MAAM,qBAAqB,GAAG,WAAW,EAAE,CAAC;AAElD,wDAAwD;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC,8EAA8E;AAC9E,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,WAAW,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;IACxC,gFAAgF;IAChF,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAC;CAC7C;AAED,sDAAsD;AACtD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,gBAAgB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAMpE,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,EAAE,CAAC;IACR,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE5E,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,gDAAiD,CAAC;AAEnF,+DAA+D;AAC/D,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEpE,4EAA4E;AAC5E,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO;IAC3E,iFAAiF;IACjF,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oCAAoC;IACpC,kBAAkB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IACjC,sDAAsD;IACtD,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,+DAA+D;IAC/D,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3D,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,KAAK,IAAI,CAAC;IAC1D;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,+EAA+E;IAC/E,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,iEAAiE;IACjE,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|