@@ -120,6 +120,7 @@ class ErrsolePostgres extends EventEmitter {
120
120
timestamp TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
121
121
level VARCHAR(31) DEFAULT 'info',
122
122
message TEXT,
123
+ message_tsv TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', message)) STORED,
123
124
meta TEXT,
124
125
errsole_id BIGINT
125
126
)` ,
@@ -129,6 +130,7 @@ class ErrsolePostgres extends EventEmitter {
129
130
`CREATE INDEX IF NOT EXISTS idx_${ this . logsTable } _source_level_timestamp_id ON ${ this . logsTable } (source, level, timestamp, id)` ,
130
131
`CREATE INDEX IF NOT EXISTS idx_${ this . logsTable } _timestamp_id ON ${ this . logsTable } (timestamp, id)` ,
131
132
`CREATE INDEX IF NOT EXISTS idx_${ this . logsTable } _errsole_id ON ${ this . logsTable } (errsole_id)` ,
133
+ `CREATE INDEX IF NOT EXISTS idx_${ this . logsTable } _message_tsv ON ${ this . logsTable } USING GIN (message_tsv)` ,
132
134
133
135
`CREATE TABLE IF NOT EXISTS ${ this . usersTable } (
134
136
id BIGSERIAL PRIMARY KEY,
@@ -410,10 +412,9 @@ class ErrsolePostgres extends EventEmitter {
410
412
411
413
// Search terms with AND logic
412
414
if ( searchTerms && searchTerms . length > 0 ) {
413
- searchTerms . forEach ( term => {
414
- whereClauses . push ( `message ILIKE $${ index ++ } ` ) ;
415
- values . push ( `%${ term } %` ) ;
416
- } ) ;
415
+ const tsQuery = searchTerms . map ( term => `${ term } :*` ) . join ( ' & ' ) ; // AND logic for search terms
416
+ whereClauses . push ( `message_tsv @@ to_tsquery('english', $${ index ++ } )` ) ;
417
+ values . push ( tsQuery ) ;
417
418
}
418
419
419
420
// Apply filters
0 commit comments