@strav/search 0.3.20 → 0.3.22

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 (34) hide show
  1. package/README.md +122 -3
  2. package/package.json +4 -4
  3. package/src/commands/search_optimize.ts +52 -0
  4. package/src/commands/search_rebuild.ts +73 -0
  5. package/src/drivers/embedded/embedded_driver.ts +136 -0
  6. package/src/drivers/embedded/engine/field_registry.ts +97 -0
  7. package/src/drivers/embedded/engine/fts_query_builder.ts +184 -0
  8. package/src/drivers/embedded/engine/query_compiler.ts +134 -0
  9. package/src/drivers/embedded/engine/schema.ts +99 -0
  10. package/src/drivers/embedded/engine/snippet_formatter.ts +29 -0
  11. package/src/drivers/embedded/engine/sqlite_engine.ts +255 -0
  12. package/src/drivers/embedded/engine/typo_expander.ts +138 -0
  13. package/src/drivers/embedded/errors.ts +15 -0
  14. package/src/drivers/embedded/filters/filter_compiler.ts +136 -0
  15. package/src/drivers/embedded/index.ts +3 -0
  16. package/src/drivers/embedded/storage/paths.ts +23 -0
  17. package/src/drivers/embedded/types.ts +34 -0
  18. package/src/drivers/postgres/engine/field_registry.ts +116 -0
  19. package/src/drivers/postgres/engine/fts_query_builder.ts +105 -0
  20. package/src/drivers/postgres/engine/pg_engine.ts +300 -0
  21. package/src/drivers/postgres/engine/query_compiler.ts +165 -0
  22. package/src/drivers/postgres/engine/schema.ts +187 -0
  23. package/src/drivers/postgres/engine/snippet_formatter.ts +31 -0
  24. package/src/drivers/postgres/engine/typo_expander.ts +131 -0
  25. package/src/drivers/postgres/errors.ts +33 -0
  26. package/src/drivers/postgres/filters/filter_compiler.ts +138 -0
  27. package/src/drivers/postgres/index.ts +14 -0
  28. package/src/drivers/postgres/postgres_fts_driver.ts +184 -0
  29. package/src/drivers/postgres/rebuild/rebuild_inplace.ts +113 -0
  30. package/src/drivers/postgres/storage/identifiers.ts +46 -0
  31. package/src/drivers/postgres/types.ts +53 -0
  32. package/src/index.ts +11 -0
  33. package/src/search_manager.ts +7 -0
  34. package/stubs/config/search.ts +25 -0
@@ -0,0 +1,53 @@
1
+ import type { SQL } from 'bun'
2
+ import type { DriverConfig, IndexSettings } from '../../types.ts'
3
+
4
+ export type TypoToleranceMode = 'off' | 'auto'
5
+
6
+ export interface TypoToleranceSettings {
7
+ /** Minimum token length to consider for fuzzy expansion (default 4). */
8
+ minTokenLength?: number
9
+ /** Maximum Levenshtein distance to tolerate (default 1; 2 is supported but slower). */
10
+ maxDistance?: number
11
+ /** pg_trgm similarity threshold (default 0.4). Higher = stricter. */
12
+ similarity?: number
13
+ }
14
+
15
+ export interface PostgresFtsConfig extends DriverConfig {
16
+ driver: string
17
+ /**
18
+ * Bun SQL connection. If omitted, the driver falls back to
19
+ * `Database.raw` from `@strav/database` (must be bootstrapped first).
20
+ */
21
+ connection?: SQL
22
+ /** Postgres schema for index tables. Default 'strav_search'. */
23
+ schema?: string
24
+ /** Default text-search configuration ('english', 'french', ...). */
25
+ language?: string
26
+ /** Typo tolerance: 'off' disables; 'auto' uses defaults; object for fine-grained control. */
27
+ typoTolerance?: TypoToleranceMode | TypoToleranceSettings
28
+ /** GIN index tuning. */
29
+ gin?: {
30
+ /** Default false — better tail latency for read-heavy search. */
31
+ fastupdate?: boolean
32
+ }
33
+ /** Per-search-transaction work_mem hint, e.g. '64MB'. Set to null/empty to skip. */
34
+ workMem?: string | null
35
+ }
36
+
37
+ /** Resolved typo tolerance settings (after defaults applied). */
38
+ export interface ResolvedTypoTolerance {
39
+ enabled: boolean
40
+ minTokenLength: number
41
+ maxDistance: number
42
+ similarity: number
43
+ }
44
+
45
+ /** Per-index extra settings stored in `_meta`. */
46
+ export interface PgIndexSettings extends IndexSettings {
47
+ language?: string
48
+ /**
49
+ * Per-attribute weight tier override. Keys must appear in `searchableAttributes`.
50
+ * Values: 'A' | 'B' | 'C' | 'D'. Default = positional (1st=A, 2nd=B, ...).
51
+ */
52
+ weights?: Record<string, 'A' | 'B' | 'C' | 'D'>
53
+ }
package/src/index.ts CHANGED
@@ -12,6 +12,17 @@ export { MeilisearchDriver } from './drivers/meilisearch_driver.ts'
12
12
  export { TypesenseDriver } from './drivers/typesense_driver.ts'
13
13
  export { AlgoliaDriver } from './drivers/algolia_driver.ts'
14
14
  export { NullDriver } from './drivers/null_driver.ts'
15
+ export { EmbeddedDriver } from './drivers/embedded/index.ts'
16
+ export type {
17
+ EmbeddedConfig,
18
+ TypoToleranceMode,
19
+ TypoToleranceSettings,
20
+ } from './drivers/embedded/index.ts'
21
+ export { PostgresFtsDriver } from './drivers/postgres/index.ts'
22
+ export type {
23
+ PostgresFtsConfig,
24
+ PgIndexSettings,
25
+ } from './drivers/postgres/index.ts'
15
26
 
16
27
  // Mixin
17
28
  export { searchable } from './searchable.ts'
@@ -5,6 +5,8 @@ import { MeilisearchDriver } from './drivers/meilisearch_driver.ts'
5
5
  import { TypesenseDriver } from './drivers/typesense_driver.ts'
6
6
  import { AlgoliaDriver } from './drivers/algolia_driver.ts'
7
7
  import { NullDriver } from './drivers/null_driver.ts'
8
+ import { EmbeddedDriver } from './drivers/embedded/index.ts'
9
+ import { PostgresFtsDriver } from './drivers/postgres/index.ts'
8
10
 
9
11
  @inject
10
12
  export default class SearchManager {
@@ -86,6 +88,11 @@ export default class SearchManager {
86
88
  return new TypesenseDriver(config)
87
89
  case 'algolia':
88
90
  return new AlgoliaDriver(config)
91
+ case 'embedded':
92
+ return new EmbeddedDriver(config)
93
+ case 'postgres-fts':
94
+ case 'postgres':
95
+ return new PostgresFtsDriver(config)
89
96
  case 'null':
90
97
  return new NullDriver()
91
98
  default:
@@ -28,5 +28,30 @@ export default {
28
28
  appId: env('ALGOLIA_APP_ID', ''),
29
29
  apiKey: env('ALGOLIA_SECRET', ''),
30
30
  },
31
+
32
+ embedded: {
33
+ driver: 'embedded',
34
+ /** Directory holding per-index `.sqlite` files. Use ':memory:' for tests. */
35
+ path: env('SEARCH_PATH', './storage/search'),
36
+ /** SQLite synchronous pragma. NORMAL is crash-safe with sub-second-of-writes loss. */
37
+ synchronous: env('SEARCH_SYNCHRONOUS', 'NORMAL'),
38
+ /** Typo tolerance: 'off' to disable, 'auto' for defaults, or { minTokenLength, maxDistance }. */
39
+ typoTolerance: env('SEARCH_TYPO_TOLERANCE', 'auto'),
40
+ },
41
+
42
+ postgres: {
43
+ driver: 'postgres-fts',
44
+ /** Postgres schema for index tables. */
45
+ schema: env('SEARCH_PG_SCHEMA', 'strav_search'),
46
+ /** Default text-search configuration ('english', 'french', ...). */
47
+ language: env('SEARCH_PG_LANGUAGE', 'english'),
48
+ /** Typo tolerance: 'off' to disable, 'auto' for defaults, or { minTokenLength, maxDistance, similarity }. */
49
+ typoTolerance: env('SEARCH_TYPO_TOLERANCE', 'auto'),
50
+ /** Per-search work_mem hint. Set to null/empty to skip. */
51
+ workMem: env('SEARCH_PG_WORK_MEM', '64MB'),
52
+ /** GIN index tuning — fastupdate=off improves read tail latency. */
53
+ gin: { fastupdate: false },
54
+ // `connection` (Bun SQL instance) is resolved from @strav/database at runtime.
55
+ },
31
56
  },
32
57
  }