fix(search): always ensure pg_trgm extension availability for PostgreSQL search (#7845)

* fix(search): ensure pg_trgm extension availability for PostgreSQL search

- Move pg_trgm extension creation to initialization phase to ensure availability
- Add error handling for similarity search queries that depend on pg_trgm
- Add proper logging for debugging search-related issues

Fixes issues where PostgreSQL search suggestions fail due to missing or
improperly initialized pg_trgm extension, particularly in containerized
environments where extension creation timing matters.

* fix: Simplify error handling in search suggestion logic

Refactor error handling for search suggestions to simplify code.

---------

Co-authored-by: Nicolas Giard <github@ngpixel.com>
main
scottnursten-22 3 weeks ago committed by GitHub
parent 54d21ae538
commit 407aacfa19
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -23,6 +23,9 @@ module.exports = {
async init() { async init() {
WIKI.logger.info(`(SEARCH/POSTGRES) Initializing...`) WIKI.logger.info(`(SEARCH/POSTGRES) Initializing...`)
// -> Ensure pg_trgm extension is available (required for similarity search)
await WIKI.models.knex.raw('CREATE EXTENSION IF NOT EXISTS pg_trgm')
// -> Create Search Index // -> Create Search Index
const indexExists = await WIKI.models.knex.schema.hasTable('pagesVector') const indexExists = await WIKI.models.knex.schema.hasTable('pagesVector')
if (!indexExists) { if (!indexExists) {
@ -45,7 +48,6 @@ module.exports = {
CREATE TABLE "pagesWords" AS SELECT word FROM ts_stat( CREATE TABLE "pagesWords" AS SELECT word FROM ts_stat(
'SELECT to_tsvector(''simple'', "title") || to_tsvector(''simple'', "description") || to_tsvector(''simple'', "content") FROM "pagesVector"' 'SELECT to_tsvector(''simple'', "title") || to_tsvector(''simple'', "description") || to_tsvector(''simple'', "content") FROM "pagesVector"'
)`) )`)
await WIKI.models.knex.raw('CREATE EXTENSION IF NOT EXISTS pg_trgm')
await WIKI.models.knex.raw(`CREATE INDEX "pageWords_idx" ON "pagesWords" USING GIN (word gin_trgm_ops)`) await WIKI.models.knex.raw(`CREATE INDEX "pageWords_idx" ON "pagesWords" USING GIN (word gin_trgm_ops)`)
} }
@ -81,8 +83,12 @@ module.exports = {
${qryEnd} ${qryEnd}
`, qryParams) `, qryParams)
if (results.rows.length < 5) { if (results.rows.length < 5) {
const suggestResults = await WIKI.models.knex.raw(`SELECT word, word <-> ? AS rank FROM "pagesWords" WHERE similarity(word, ?) > 0.2 ORDER BY rank LIMIT 5;`, [q, q]) try {
suggestions = suggestResults.rows.map(r => r.word) const suggestResults = await WIKI.models.knex.raw(`SELECT word, word <-> ? AS rank FROM "pagesWords" WHERE similarity(word, ?) > 0.2 ORDER BY rank LIMIT 5;`, [q, q])
suggestions = suggestResults.rows.map(r => r.word)
} catch (err) {
WIKI.logger.warn(`Search Engine Suggestion Error (pg_trgm extension may be missing): ${err.message}`)
}
} }
return { return {
results: results.rows, results: results.rows,

Loading…
Cancel
Save