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.
Files changed (38) hide show
  1. package/CLAUDE.md +8 -2
  2. package/README.md +53 -0
  3. package/UNIVERSE.md +12 -0
  4. package/dist/common/numeric/createSearchArrayMetadata.d.ts +10 -0
  5. package/dist/common/numeric/createSearchArrayMetadata.d.ts.map +1 -1
  6. package/dist/common/numeric/matchMany.d.ts +111 -0
  7. package/dist/common/numeric/matchMany.d.ts.map +1 -0
  8. package/dist/common/numeric/prepareQueryVariants.d.ts +24 -0
  9. package/dist/common/numeric/prepareQueryVariants.d.ts.map +1 -1
  10. package/dist/common/numeric/searchAndRank.d.ts.map +1 -1
  11. package/dist/common/numeric/searchInData.d.ts.map +1 -1
  12. package/dist/common/numeric/syncSearchArrayMetadata.d.ts.map +1 -1
  13. package/dist/common/numeric/updateSearchMetadata.d.ts.map +1 -1
  14. package/dist/index.cjs +300 -113
  15. package/dist/index.d.cts +5 -1
  16. package/dist/index.d.ts +5 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +300 -113
  19. package/dist/types/index.d.ts +65 -0
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/vet/data/enote.d.ts +40 -0
  22. package/dist/vet/data/enote.d.ts.map +1 -0
  23. package/dist/vet/data/znamke.gen.d.ts +41 -0
  24. package/dist/vet/data/znamke.gen.d.ts.map +1 -0
  25. package/dist/vet/index.cjs +2468 -0
  26. package/dist/vet/index.d.cts +24 -0
  27. package/dist/vet/index.d.ts +24 -0
  28. package/dist/vet/index.d.ts.map +1 -0
  29. package/dist/vet/index.js +2426 -0
  30. package/dist/vet/normalizatorji.d.ts +104 -0
  31. package/dist/vet/normalizatorji.d.ts.map +1 -0
  32. package/dist/vet/ocena.d.ts +46 -0
  33. package/dist/vet/ocena.d.ts.map +1 -0
  34. package/dist/vet/spec.d.ts +35 -0
  35. package/dist/vet/spec.d.ts.map +1 -0
  36. package/dist/vet/uparjanje.d.ts +72 -0
  37. package/dist/vet/uparjanje.d.ts.map +1 -0
  38. package/package.json +29 -11
package/CLAUDE.md CHANGED
@@ -337,7 +337,12 @@ Override match behavior per token at search time. Priority: query prefix > field
337
337
  1. prepareStringForSearch pipeline minus the trailing .sort()
338
338
  2. required for any positional / order-aware scoring
339
339
  3. do NOT use these tokens for candidate retrieval (sorted lists required)
340
- 16. Scoring primitives (in src/common/numeric/scoring.ts, re-exported from main)
340
+ 16. compareTokenized(a: string, b: string): number
341
+ 1. tokenizes both strings with prepareStringForSearch (same pipeline)
342
+ 2. returns Jaccard similarity of the token sets: |A∩B| / |A∪B| ∈ [0, 1]
343
+ 3. order-independent, case/diacritics-insensitive, dedupes repeated tokens
344
+ 4. both empty → 1; empty vs non-empty → 0
345
+ 17. Scoring primitives (in src/common/numeric/scoring.ts, re-exported from main)
341
346
  1. scoreOne(query, qTokens, itemTokens, exactKeys?): number
342
347
  - feature-rich scoring: +100_000 exact, +50 base, +100 all-matched, +50 first-word,
343
348
  +80 perfect prefix, +30*(matched/span) density, -0.1*Σitemtoken.length penalty
@@ -392,7 +397,8 @@ src/
392
397
  │ ├── normalizeDates.ts
393
398
  │ ├── preprocessString.ts
394
399
  │ ├── sanitiseString.ts
395
- │ └── tokenize.ts
400
+ │ ├── tokenize.ts
401
+ │ └── compareTokenized.ts # Jaccard token-set similarity (0..1)
396
402
  ├── types/
397
403
  │ └── index.ts
398
404
  └── index.ts # Public API
package/README.md CHANGED
@@ -12,6 +12,7 @@ A fast, memory-efficient search library for large datasets with support for toke
12
12
  - **Search prefixes** - use `-word`, `--word`, or `~word` to exclude, `..word` for suffix, `=word` for exact match
13
13
  - **Automatic normalization** - Handles diacritics, case, dates, and number formatting
14
14
  - **Ranked search** - `searchAndRank` returns results scored by positional relevance (token order, contiguity, perfect-prefix, length)
15
+ - **String similarity** - `compareTokenized(a, b)` returns Jaccard token-set similarity (`0..1`) for fuzzy name/label matching
15
16
  - **[Universal search](./UNIVERSE.md)** - Search and update across linked collections (e.g., customers with their pets)
16
17
 
17
18
  ## Table of Contents
@@ -26,6 +27,7 @@ A fast, memory-efficient search library for large datasets with support for toke
26
27
  - [Updating Existing Data](#updating-existing-data)
27
28
  - [Augmented Metadata - Local Search Context](#augmented-metadata---local-search-context)
28
29
  - [Ranked Search with Positional Scoring](#ranked-search-with-positional-scoring)
30
+ - [String Similarity](#string-similarity)
29
31
  - [Architecture](#architecture)
30
32
  - [Text Processing Pipeline](#text-processing-pipeline)
31
33
  - [Metadata Building](#metadata-building)
@@ -86,6 +88,17 @@ const results3 = searchInDataReturnObjects('IPHONE', metadata, data);
86
88
  // Returns: Map with product 1
87
89
  ```
88
90
 
91
+ ### String Similarity
92
+
93
+ ```typescript
94
+ import { compareTokenized } from 'cry-search';
95
+
96
+ // Jaccard similarity of the token sets (0 = no overlap, 1 = identical).
97
+ compareTokenized('Janez Novak', 'novak janez'); // 1 (order-independent)
98
+ compareTokenized('Janes Novak', 'novak'); // 0.5 (one of two tokens shared)
99
+ compareTokenized('Janez Novak', 'ana'); // 0 (no shared tokens)
100
+ ```
101
+
89
102
  ### SearchUniverse with Linked Collections
90
103
 
91
104
  For related data (like customers and their pets), use `SearchUniverse` to search across collections:
@@ -518,3 +531,43 @@ See [CLAUDE.md](./CLAUDE.md) for the complete technical specification including:
518
531
  ## License
519
532
 
520
533
  See [LICENSE.md](./LICENSE.md) for license terms.
534
+
535
+ ## Domain extensions and the `cry-search/vet` entry point
536
+
537
+ The core exposes a narrow seam for domain logic (all optional, no behaviour change when unused):
538
+
539
+ - `SearchableObjectSpec.valueNormalizers` — index-time normalizers for field values, able to
540
+ return `{ text, classes }`; the classes land in `metadata.classes` (accessible via
541
+ `itemClasses(metadata, id)`) and **never take part in retrieval** — they are soft.
542
+ - `SearchOpts.queryNormalizers` + `normalizeQueryWithOpts(query, opts)` — the same mapping on
543
+ the query side, with the query classes returned to the caller.
544
+ - `matchMany(prepared, queries, opts)` — mass matching: an index of one collection, the other
545
+ collection as queries; asynchronous iterator (chunked), top-K candidates per item with scores,
546
+ optional `samoEnolicno` (greedy 1:1), optional domain `rank`/`accept`, and
547
+ `alternativnePoizvedbe` (retry with a narrowed query).
548
+
549
+ A ready-made veterinary implementation ships as a subpath (optional peer dependency on
550
+ `cry-vetzdravila`):
551
+
552
+ ```bash
553
+ bun add cry-search cry-vetzdravila
554
+ ```
555
+
556
+ ```typescript
557
+ import { pripraviVetIndeks, upariArtikle, vetArtikelSpec, vetQueryOpts, oceniPar } from 'cry-search/vet';
558
+
559
+ const indeks = pripraviVetIndeks(pantheonArtikli); // { data, metadata }
560
+ for await (const kos of upariArtikle(indeks, klikvetArtikli, { limit: 3 })) {
561
+ for (const par of kos) {
562
+ const k = par.kandidati[0];
563
+ if (k?.sprejeto) console.log(par.id, '->', k.item.naziv, k.ocena.razlog);
564
+ }
565
+ }
566
+ ```
567
+
568
+ It normalizes units (`tbl`/`tableta`), ranges (`15kg-30kg`, `15 - 30 kg`), decimal commas,
569
+ brand abbreviations (`RC` → `Royal Canin`) and brand lines (`SHN` → `Royal Canin SHN`), lemmatizes
570
+ animal species (`race`/`raca` → `raca`) with dogs/cats as a class, removes Pantheon type markers,
571
+ suppliers and professional markers, and accepts a pair only when both names cover each other
572
+ (whole-word coverage) — see `VET.md` for the measured quality (99.9 % on identical names,
573
+ ~68 % on similar names) and the generation of the bundled brand table (`bun run gen:vet-data`).
package/UNIVERSE.md CHANGED
@@ -875,3 +875,15 @@ priority over the ordinary segmented query. If no phone variant finds a result,
875
875
  SearchUniverse falls back to its usual raw-token search. Caller-supplied
876
876
  `phoneQueryNormalizers` are additional variants; they do not replace the
877
877
  collection-derived normalizers.
878
+
879
+ ## String similarity (compareTokenized)
880
+
881
+ `compareTokenized(a, b)` compares two strings through the same
882
+ `prepareStringForSearch` pipeline and returns the Jaccard similarity of their
883
+ token sets (`|A∩B| / |A∪B|`, `0..1`). Order-independent and
884
+ case/diacritics-insensitive. Useful for fuzzy name/label matching.
885
+
886
+ ```text
887
+ compareTokenized('Janez Novak', 'novak janez') // 1
888
+ compareTokenized('Janes Novak', 'novak') // 0.5
889
+ ```
@@ -59,7 +59,17 @@ export declare function decodeMatchMode(encoded: number): MatchMode;
59
59
  export interface PreparedObjectTokens {
60
60
  sorted: NumericTokenSortedList;
61
61
  firstN: NumericTokenUnsortedList | undefined;
62
+ /**
63
+ * Domain classes produced by `spec.valueNormalizers` (e.g. `{ razpon: ['15-30'] }`).
64
+ * `undefined` when no normalizer produced classes.
65
+ */
66
+ classes?: Record<string, string[]>;
62
67
  }
68
+ /**
69
+ * Domain classes of one item, always normalised to lists.
70
+ * `undefined` when the item has none.
71
+ */
72
+ export declare function itemClasses(metadata: NumericSearchMetadata, id: string): Record<string, string[]> | undefined;
63
73
  /**
64
74
  * Prepares an object for search, returning numeric token IDs for both retrieval and ranking.
65
75
  *
@@ -1 +1 @@
1
- {"version":3,"file":"createSearchArrayMetadata.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/createSearchArrayMetadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAUrB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAEjE;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAMzD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAS1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAMrD,CAAC;AAKF,mDAAmD;AACnD,eAAO,MAAM,aAAa,QAAwB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAS1D;AAoED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACnF,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,EAC5C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,oBAAoB,GAAG,SAAS,CA0BlC;AAgID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACtF,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC,qBAAqB,CAoBvB;AAED,yDAAyD;AACzD,wBAAgB,0BAA0B,IAAI,qBAAqB,CAElE"}
1
+ {"version":3,"file":"createSearchArrayMetadata.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/createSearchArrayMetadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,SAAS,EAET,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAUrB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAEjE;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAMzD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAS1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAMrD,CAAC;AAKF,mDAAmD;AACnD,eAAO,MAAM,aAAa,QAAwB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAS1D;AAoED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACpC;AA4CD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,qBAAqB,EAC/B,EAAE,EAAE,MAAM,GACT,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,CAGtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACnF,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,EAC5C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,oBAAoB,GAAG,SAAS,CA4BlC;AAqJD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACtF,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC,qBAAqB,CAuBvB;AAED,yDAAyD;AACzD,wBAAgB,0BAA0B,IAAI,qBAAqB,CAElE"}
@@ -0,0 +1,111 @@
1
+ import type { Id, NormalizedValue, NumericSearchMetadata, SearchableData, SearchableObject, SearchOpts } from '../../types';
2
+ /**
3
+ * Kandidat pri masovnem uparjanju: zapis desne strani z oceno in domenskimi razredi.
4
+ */
5
+ export interface MatchManyKandidat<T extends SearchableObject> {
6
+ id: Id;
7
+ item: T;
8
+ /** Ocena jedra (`scoreOne`) ali domenska ocena, če je podana `rank`. */
9
+ score: number;
10
+ /** Domenski razredi kandidata (`metadata.classes`), če jih ima. */
11
+ classes?: Record<string, string[]>;
12
+ }
13
+ /** Rezultat za en element leve strani. */
14
+ export interface MatchManyRezultat<T extends SearchableObject> {
15
+ /** ID elementa leve strani (kot ga vrne `idOf`). */
16
+ id: string;
17
+ /** Razredi poizvedbe, če jih je vrnil `queryOf`. */
18
+ queryClasses?: Record<string, string[]>;
19
+ /** Kandidati, urejeni padajoče po oceni (največ `limit`). */
20
+ kandidati: MatchManyKandidat<T>[];
21
+ }
22
+ /** Nastavitve masovnega uparjanja. */
23
+ export interface MatchManyOptions<T extends SearchableObject, TQuery> {
24
+ /**
25
+ * Besedilo poizvedbe za en element leve strani; lahko vrne tudi razrede
26
+ * (`{ text, classes }`), ki jih dobi domenski ocenjevalec.
27
+ */
28
+ queryOf: (query: TQuery) => string | NormalizedValue;
29
+ /** ID elementa leve strani (privzeto `_id`, nato `id`, nazadnje zaporedna številka). */
30
+ idOf?: (query: TQuery, indeks: number) => string;
31
+ /** Največ kandidatov na element (privzeto 3). */
32
+ limit?: number;
33
+ /**
34
+ * Koliko kandidatov preberemo iz jedra, PREDEN jih oceni domenski `rank`/`accept`.
35
+ * Privzeto `max(20, limit * 4)`: domenski ocenjevalec pogosto prerazporedi
36
+ * kandidate, zato mora videti širši nabor od končnega `limit`.
37
+ */
38
+ retrievalLimit?: number;
39
+ /** Spodnji prag ocene (privzeto 0). */
40
+ minScore?: number;
41
+ /** Koliko elementov na kos izhodnega iteratorja (privzeto 50). */
42
+ kos?: number;
43
+ /**
44
+ * Poželjiva 1:1 dodelitev: vsak kandidat (element desne strani) se porabi
45
+ * največ enkrat. Uporabno za množične uvoze; iterator je treba porabljati
46
+ * po vrsti, ker se odločitve sprejemajo sproti.
47
+ */
48
+ samoEnolicno?: boolean;
49
+ /** Vrstni red po elementih leve strani (privzeto podan vrstni red). */
50
+ primaryTextOf?: (item: T) => string | undefined;
51
+ /** Natančni ključi kandidata (npr. črtna koda) za `+100000` bonus. */
52
+ exactKeysOf?: (item: T) => readonly string[] | undefined;
53
+ /** Domenska ocena: če podana, zamenja jedrno oceno. */
54
+ rank?: (kandidat: {
55
+ id: Id;
56
+ item: T;
57
+ classes?: Record<string, string[]>;
58
+ }, poizvedba: {
59
+ text: string;
60
+ classes?: Record<string, string[]>;
61
+ }) => number;
62
+ /** Domenski sprejem: če podana, se nesprejeti kandidati izločijo. */
63
+ accept?: (kandidat: {
64
+ id: Id;
65
+ item: T;
66
+ classes?: Record<string, string[]>;
67
+ }, poizvedba: {
68
+ text: string;
69
+ classes?: Record<string, string[]>;
70
+ }) => boolean;
71
+ /** Dodatne iskalne nastavitve (načini ujemanja, normalizatorji poizvedbe). */
72
+ opts?: SearchOpts;
73
+ /**
74
+ * Nadomestne poizvedbe, ki se poskusijo, kadar glavna poizvedba ne vrne NOBENEGA
75
+ * kandidata (po `accept`). Uporablja domena, kadar zna poizvedbo zožiti
76
+ * (npr. izpust najmanj informativnih besed); vsaka varianta gre skozi isto
77
+ * iskanje in ocenjevanje, zato se natančnost ne more poslabšati.
78
+ */
79
+ alternativnePoizvedbe?: (query: TQuery) => readonly (string | NormalizedValue)[];
80
+ /**
81
+ * Kadar je `true`, se nadomestne poizvedbe poskusijo le, če prva ni vrnila
82
+ * NOBENEGA zadetka (ne pa tudi, kadar so bili vsi zavrnjeni s `accept`).
83
+ * Privzeto `false` (več priklica, počasneje).
84
+ */
85
+ alternativneLeCeNiZadetkov?: boolean;
86
+ }
87
+ /** Pripravljen indeks ene strani (`data` + `metadata`). */
88
+ export interface PreparedCollection<T extends SearchableObject> {
89
+ data: SearchableData<T>;
90
+ metadata: NumericSearchMetadata;
91
+ }
92
+ /**
93
+ * Masovno uparjanje: indeks ene strani, elementi druge strani kot poizvedbe.
94
+ *
95
+ * Vrne async iterator, ki teče po kosih (`kos`, privzeto 50), tako da rezultat
96
+ * velikega uparjanja (npr. 40k × 25k) ne gre v celoti v pomnilnik. Za vsak
97
+ * element vrne največ `limit` kandidatov nad `minScore`, urejenih padajoče.
98
+ *
99
+ * Uporablja isto iskalno logiko kot `searchAndRank` (retrieval po `metadata.sorted`
100
+ * z AND-ujemanjem + ocena po `metadata.unsorted`), zato so rezultati skladni z
101
+ * navadnim iskanjem. Domenski modul lahko oceno in sprejem zamenja z `rank`/`accept`.
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * for await (const kos of matchMany(prepared, levi, { queryOf: (a) => a.naziv })) {
106
+ * console.log(kos.id, kos.kandidati[0]?.item.naziv);
107
+ * }
108
+ * ```
109
+ */
110
+ export declare function matchMany<T extends SearchableObject, TQuery>(prepared: PreparedCollection<T>, queries: readonly TQuery[], options: MatchManyOptions<T, TQuery>): AsyncGenerator<MatchManyRezultat<T>[], void, void>;
111
+ //# sourceMappingURL=matchMany.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchMany.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/matchMany.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,34 @@ export interface PreparedQueryVariants {
5
5
  rawTokenStrs: string[];
6
6
  rawTokens: PreparedQueryToken[];
7
7
  phoneTokens: PreparedQueryToken[][];
8
+ /** Dopolnilni razredi, ki jih vrnejo `opts.queryNormalizers` (npr. `razpon`). */
9
+ classes: Record<string, string[]>;
8
10
  }
11
+ /**
12
+ * Uporabi domenske normalizatorje poizvedbe (`opts.queryNormalizers`) in vrne
13
+ * kanonično besedilo + domenske razrede poizvedbe.
14
+ *
15
+ * Klicoči to uporabi, kadar mora iste razrede primerjati s kandidatovimi
16
+ * (`itemClasses(metadata, id)`) — npr. domenski ocenjevalec, ki enak razpon
17
+ * nagradi, nasprotnega pa kaznuje. Iskalne funkcije normalizatorje uporabijo
18
+ * samodejno; ta funkcija je za ocenjevalce.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const { text, classes } = normalizeQueryWithOpts('Nexgard 15-30 kg', opts);
23
+ * // classes.razpon === ['15-30']
24
+ * ```
25
+ */
26
+ export declare function normalizeQueryWithOpts(query: string, opts?: SearchOpts): {
27
+ text: string;
28
+ classes: Record<string, string[]>;
29
+ };
9
30
  /**
10
31
  * Produces deduplicated phone alternatives without changing ordinary query tokens.
11
32
  *
33
+ * Domain normalizers (`opts.queryNormalizers`) run FIRST, so both the ordinary
34
+ * tokens and the phone variants see the canonical text.
35
+ *
12
36
  * @feature [phone-search]
13
37
  */
14
38
  export declare function prepareQueryVariants(query: string, opts?: SearchOpts): PreparedQueryVariants;
@@ -1 +1 @@
1
- {"version":3,"file":"prepareQueryVariants.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/prepareQueryVariants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,WAAW,EAAE,kBAAkB,EAAE,EAAE,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,qBAAqB,CAmB5F"}
1
+ {"version":3,"file":"prepareQueryVariants.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/prepareQueryVariants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,WAAW,EAAE,kBAAkB,EAAE,EAAE,CAAC;IACpC,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,UAAU,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,CAyBrD;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,qBAAqB,CAoB5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"searchAndRank.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/searchAndRank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,EAAE,EACF,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACX,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvF,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAgBzD;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,gBAAgB;IACtD,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,CAAC,CAAC;IACR,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,gBAAgB;IAC9D;;;;OAIG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzD,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,EAC7D,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,YAAY,CAAC,CAAC,CAAC,EAAE,CAiCnB"}
1
+ {"version":3,"file":"searchAndRank.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/searchAndRank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,EAAE,EACF,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACX,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvF,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAgBzD;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,gBAAgB;IACtD,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,CAAC,CAAC;IACR,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,gBAAgB;IAC9D;;;;OAIG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzD,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,EAC7D,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,YAAY,CAAC,CAAC,CAAC,EAAE,CAmCnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"searchInData.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/searchInData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,EAAE,EACF,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACX,MAAM,aAAa,CAAC;AAMrB;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,CAAC,EAAE,UAAU,GAChB,EAAE,EAAE,CAEN;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,gBAAgB,EACzE,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,IAAI,CAAC,EAAE,UAAU,GAChB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAYZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,UAAU,GAChB,EAAE,EAAE,CA4CN"}
1
+ {"version":3,"file":"searchInData.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/searchInData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,EAAE,EACF,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACX,MAAM,aAAa,CAAC;AAMrB;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,CAAC,EAAE,UAAU,GAChB,EAAE,EAAE,CAEN;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,gBAAgB,EACzE,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,IAAI,CAAC,EAAE,UAAU,GAChB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAYZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,UAAU,GAChB,EAAE,EAAE,CA8CN"}
@@ -1 +1 @@
1
- {"version":3,"file":"syncSearchArrayMetadata.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/syncSearchArrayMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EAGpB,UAAU,EACV,WAAW,EACZ,MAAM,sBAAsB,CAAA;AAK7B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAqCnE;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACpF,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1B,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC,UAAU,CAqDZ;AAED;;;;;GAKG;AACH,wBAAgB,0CAA0C,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EAChG,QAAQ,EAAE,qBAAqB,EAC/B,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,EAC/B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,WAAW,EACrB,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC,UAAU,CAsDZ"}
1
+ {"version":3,"file":"syncSearchArrayMetadata.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/syncSearchArrayMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EAGpB,UAAU,EACV,WAAW,EACZ,MAAM,sBAAsB,CAAA;AAK7B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AA4CnE;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACpF,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1B,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC,UAAU,CAqDZ;AAED;;;;;GAKG;AACH,wBAAgB,0CAA0C,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EAChG,QAAQ,EAAE,qBAAqB,EAC/B,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,EAC/B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,WAAW,EACrB,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC,UAAU,CAsDZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateSearchMetadata.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/updateSearchMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,EAAE,EACF,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAIrB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACjF,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,EAAE,EACZ,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzB,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,EAC5C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAgBT;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACtF,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,6BAA6B,CAAC,CAAC,CAAC,EAAE,EACzC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0BtC;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,EAAE,GACX,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,qBAAqB,EAC/B,SAAS,EAAE,EAAE,EAAE,GACd,MAAM,CAYR"}
1
+ {"version":3,"file":"updateSearchMetadata.d.ts","sourceRoot":"","sources":["../../../src/common/numeric/updateSearchMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,EAAE,EACF,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAIrB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACjF,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,EAAE,EACZ,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzB,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,EAC5C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAuBT;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,GAAG,OAAO,EACtF,QAAQ,EAAE,qBAAqB,EAC/B,KAAK,EAAE,6BAA6B,CAAC,CAAC,CAAC,EAAE,EACzC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAChC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0BtC;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,EAAE,GACX,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,qBAAqB,EAC/B,SAAS,EAAE,EAAE,EAAE,GACd,MAAM,CAYR"}