Added search indexing for documents
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
import Router from 'koa-router';
|
import Router from 'koa-router';
|
||||||
import httpErrors from 'http-errors';
|
import httpErrors from 'http-errors';
|
||||||
|
import {
|
||||||
|
sequelize,
|
||||||
|
} from '../sequelize';
|
||||||
|
|
||||||
import auth from './authentication';
|
import auth from './authentication';
|
||||||
import pagination from './middlewares/pagination';
|
import pagination from './middlewares/pagination';
|
||||||
@@ -40,6 +43,42 @@ router.post('documents.info', auth({ require: false }), async (ctx) => {
|
|||||||
if (!document) throw httpErrors.NotFound();
|
if (!document) throw httpErrors.NotFound();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.post('documents.search', auth(), async (ctx) => {
|
||||||
|
let { query } = ctx.request.body;
|
||||||
|
ctx.assertPresent(query, 'query is required');
|
||||||
|
|
||||||
|
const user = await ctx.state.user;
|
||||||
|
|
||||||
|
const sql = `
|
||||||
|
SELECT * FROM documents
|
||||||
|
WHERE "searchVector" @@ to_tsquery('english', :query) AND
|
||||||
|
"teamId" = '${user.teamId}'::uuid
|
||||||
|
ORDER BY ts_rank(documents."searchVector", to_tsquery('english', :query))
|
||||||
|
DESC;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const documents = await sequelize
|
||||||
|
.query(
|
||||||
|
sql,
|
||||||
|
{
|
||||||
|
replacements: {
|
||||||
|
query: query,
|
||||||
|
},
|
||||||
|
model: Document,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let data = [];
|
||||||
|
await Promise.all(documents.map(async (document) => {
|
||||||
|
data.push(await presentDocument(document));
|
||||||
|
}));
|
||||||
|
|
||||||
|
ctx.body = {
|
||||||
|
pagination: ctx.state.pagination,
|
||||||
|
data: data,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
router.post('documents.create', auth(), async (ctx) => {
|
router.post('documents.create', auth(), async (ctx) => {
|
||||||
let {
|
let {
|
||||||
|
|||||||
46
server/migrations/20160711071958-search-index.js
Normal file
46
server/migrations/20160711071958-search-index.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
up: function (queryInterface, Sequelize) {
|
||||||
|
const searchDocument = `
|
||||||
|
ALTER TABLE documents ADD COLUMN "searchVector" tsvector;
|
||||||
|
CREATE INDEX documents_tsv_idx ON documents USING gin("searchVector");
|
||||||
|
|
||||||
|
CREATE FUNCTION documents_search_trigger() RETURNS trigger AS $$
|
||||||
|
begin
|
||||||
|
new."searchVector" :=
|
||||||
|
setweight(to_tsvector('english', coalesce(new.title, '')),'A') ||
|
||||||
|
setweight(to_tsvector('english', coalesce(new.text, '')), 'C');
|
||||||
|
return new;
|
||||||
|
end
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CREATE TRIGGER documents_tsvectorupdate BEFORE INSERT OR UPDATE
|
||||||
|
ON documents FOR EACH ROW EXECUTE PROCEDURE documents_search_trigger();
|
||||||
|
`;
|
||||||
|
|
||||||
|
const searchAtlas = `
|
||||||
|
ALTER TABLE atlases ADD COLUMN "searchVector" tsvector;
|
||||||
|
CREATE INDEX atlases_tsv_idx ON atlases USING gin("searchVector");
|
||||||
|
|
||||||
|
CREATE FUNCTION atlases_search_trigger() RETURNS trigger AS $$
|
||||||
|
begin
|
||||||
|
new."searchVector" :=
|
||||||
|
setweight(to_tsvector('english', coalesce(new.name, '')),'A') ||
|
||||||
|
setweight(to_tsvector('english', coalesce(new.description, '')), 'C');
|
||||||
|
return new;
|
||||||
|
end
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
CREATE TRIGGER atlases_tsvectorupdate BEFORE INSERT OR UPDATE
|
||||||
|
ON atlases FOR EACH ROW EXECUTE PROCEDURE atlases_search_trigger();
|
||||||
|
`;
|
||||||
|
|
||||||
|
queryInterface.sequelize.query(searchDocument);
|
||||||
|
queryInterface.sequelize.query(searchAtlas);
|
||||||
|
},
|
||||||
|
|
||||||
|
down: function (queryInterface, Sequelize) {
|
||||||
|
// TODO?
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user