@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.
- package/README.md +122 -3
- package/package.json +4 -4
- package/src/commands/search_optimize.ts +52 -0
- package/src/commands/search_rebuild.ts +73 -0
- package/src/drivers/embedded/embedded_driver.ts +136 -0
- package/src/drivers/embedded/engine/field_registry.ts +97 -0
- package/src/drivers/embedded/engine/fts_query_builder.ts +184 -0
- package/src/drivers/embedded/engine/query_compiler.ts +134 -0
- package/src/drivers/embedded/engine/schema.ts +99 -0
- package/src/drivers/embedded/engine/snippet_formatter.ts +29 -0
- package/src/drivers/embedded/engine/sqlite_engine.ts +255 -0
- package/src/drivers/embedded/engine/typo_expander.ts +138 -0
- package/src/drivers/embedded/errors.ts +15 -0
- package/src/drivers/embedded/filters/filter_compiler.ts +136 -0
- package/src/drivers/embedded/index.ts +3 -0
- package/src/drivers/embedded/storage/paths.ts +23 -0
- package/src/drivers/embedded/types.ts +34 -0
- package/src/drivers/postgres/engine/field_registry.ts +116 -0
- package/src/drivers/postgres/engine/fts_query_builder.ts +105 -0
- package/src/drivers/postgres/engine/pg_engine.ts +300 -0
- package/src/drivers/postgres/engine/query_compiler.ts +165 -0
- package/src/drivers/postgres/engine/schema.ts +187 -0
- package/src/drivers/postgres/engine/snippet_formatter.ts +31 -0
- package/src/drivers/postgres/engine/typo_expander.ts +131 -0
- package/src/drivers/postgres/errors.ts +33 -0
- package/src/drivers/postgres/filters/filter_compiler.ts +138 -0
- package/src/drivers/postgres/index.ts +14 -0
- package/src/drivers/postgres/postgres_fts_driver.ts +184 -0
- package/src/drivers/postgres/rebuild/rebuild_inplace.ts +113 -0
- package/src/drivers/postgres/storage/identifiers.ts +46 -0
- package/src/drivers/postgres/types.ts +53 -0
- package/src/index.ts +11 -0
- package/src/search_manager.ts +7 -0
- 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'
|
package/src/search_manager.ts
CHANGED
|
@@ -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:
|
package/stubs/config/search.ts
CHANGED
|
@@ -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
|
}
|