|
|
@ -1,5 +1,9 @@ |
|
|
|
const _ = require('lodash') |
|
|
|
const tsquery = require('pg-tsquery')() |
|
|
|
const stream = require('stream') |
|
|
|
const Promise = require('bluebird') |
|
|
|
const pipeline = Promise.promisify(stream.pipeline) |
|
|
|
|
|
|
|
/* global WIKI */ |
|
|
|
|
|
|
|
module.exports = { |
|
|
|
async activate() { |
|
|
@ -8,7 +12,10 @@ module.exports = { |
|
|
|
} |
|
|
|
}, |
|
|
|
async deactivate() { |
|
|
|
// not used
|
|
|
|
WIKI.logger.info(`(SEARCH/POSTGRES) Dropping index tables...`) |
|
|
|
await WIKI.models.knex.schema.dropTable('pagesWords') |
|
|
|
await WIKI.models.knex.schema.dropTable('pagesVector') |
|
|
|
WIKI.logger.info(`(SEARCH/POSTGRES) Index tables have been dropped.`) |
|
|
|
}, |
|
|
|
/** |
|
|
|
* INIT |
|
|
@ -27,6 +34,7 @@ module.exports = { |
|
|
|
table.string('title') |
|
|
|
table.string('description') |
|
|
|
table.specificType('tokens', 'TSVECTOR') |
|
|
|
table.text('content') |
|
|
|
}) |
|
|
|
} |
|
|
|
// -> Create Words Index
|
|
|
@ -71,7 +79,6 @@ module.exports = { |
|
|
|
WIKI.logger.warn('Search Engine Error:') |
|
|
|
WIKI.logger.warn(err) |
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
/** |
|
|
|
* CREATE |
|
|
@ -80,10 +87,10 @@ module.exports = { |
|
|
|
*/ |
|
|
|
async created(page) { |
|
|
|
await WIKI.models.knex.raw(`
|
|
|
|
INSERT INTO "pagesVector" (path, locale, title, description, tokens) VALUES ( |
|
|
|
'?', '?', '?', '?', (setweight(to_tsvector('${this.config.dictLanguage}', '?'), 'A') || setweight(to_tsvector('${this.config.dictLanguage}', '?'), 'B') || setweight(to_tsvector('${this.config.dictLanguage}', '?'), 'C')) |
|
|
|
INSERT INTO "pagesVector" (path, locale, title, description, "tokens") VALUES ( |
|
|
|
?, ?, ?, ?, (setweight(to_tsvector('${this.config.dictLanguage}', ?), 'A') || setweight(to_tsvector('${this.config.dictLanguage}', ?), 'B') || setweight(to_tsvector('${this.config.dictLanguage}', ?), 'C')) |
|
|
|
) |
|
|
|
`, [page.path, page.localeCode, page.title, page.description, page.title, page.description, page.content])
|
|
|
|
`, [page.path, page.localeCode, page.title, page.description, page.title, page.description, page.safeContent])
|
|
|
|
}, |
|
|
|
/** |
|
|
|
* UPDATE |
|
|
@ -99,7 +106,7 @@ module.exports = { |
|
|
|
setweight(to_tsvector('${this.config.dictLanguage}', ?), 'B') || |
|
|
|
setweight(to_tsvector('${this.config.dictLanguage}', ?), 'C')) |
|
|
|
WHERE path = ? AND locale = ? |
|
|
|
`, [page.title, page.description, page.title, page.description, page.content, page.path, page.localeCode])
|
|
|
|
`, [page.title, page.description, page.title, page.description, page.safeContent, page.path, page.localeCode])
|
|
|
|
}, |
|
|
|
/** |
|
|
|
* DELETE |
|
|
@ -132,14 +139,34 @@ module.exports = { |
|
|
|
async rebuild() { |
|
|
|
WIKI.logger.info(`(SEARCH/POSTGRES) Rebuilding Index...`) |
|
|
|
await WIKI.models.knex('pagesVector').truncate() |
|
|
|
await WIKI.models.knex('pagesWords').truncate() |
|
|
|
|
|
|
|
await pipeline( |
|
|
|
WIKI.models.knex.column('path', 'localeCode', 'title', 'description', 'render').select().from('pages').where({ |
|
|
|
isPublished: true, |
|
|
|
isPrivate: false |
|
|
|
}).stream(), |
|
|
|
new stream.Transform({ |
|
|
|
objectMode: true, |
|
|
|
transform: async (page, enc, cb) => { |
|
|
|
const content = WIKI.models.pages.cleanHTML(page.render) |
|
|
|
await WIKI.models.knex.raw(`
|
|
|
|
INSERT INTO "pagesVector" (path, locale, title, description, "tokens", content) VALUES ( |
|
|
|
?, ?, ?, ?, (setweight(to_tsvector('${this.config.dictLanguage}', ?), 'A') || setweight(to_tsvector('${this.config.dictLanguage}', ?), 'B') || setweight(to_tsvector('${this.config.dictLanguage}', ?), 'C')), ? |
|
|
|
) |
|
|
|
`, [page.path, page.localeCode, page.title, page.description, page.title, page.description, content, content])
|
|
|
|
cb() |
|
|
|
} |
|
|
|
}) |
|
|
|
) |
|
|
|
|
|
|
|
await WIKI.models.knex.raw(`
|
|
|
|
INSERT INTO "pagesVector" (path, locale, title, description, "tokens") |
|
|
|
SELECT path, "localeCode" AS locale, title, description, |
|
|
|
(setweight(to_tsvector('${this.config.dictLanguage}', title), 'A') || |
|
|
|
setweight(to_tsvector('${this.config.dictLanguage}', description), 'B') || |
|
|
|
setweight(to_tsvector('${this.config.dictLanguage}', content), 'C')) AS tokens |
|
|
|
FROM "pages" |
|
|
|
WHERE pages."isPublished" AND NOT pages."isPrivate"`)
|
|
|
|
INSERT INTO "pagesWords" (word) |
|
|
|
SELECT word FROM ts_stat( |
|
|
|
'SELECT to_tsvector(''simple'', "title") || to_tsvector(''simple'', "description") || to_tsvector(''simple'', "content") FROM "pagesVector"' |
|
|
|
) |
|
|
|
`)
|
|
|
|
|
|
|
|
WIKI.logger.info(`(SEARCH/POSTGRES) Index rebuilt successfully.`) |
|
|
|
} |
|
|
|
} |