Skip to content

Commit 4071410

Browse files
Merge pull request #561 from NteinPrecious/feat/upgrade-asset-search-to-use-postgresql-full-text-search
feat: upgrade asset search to use multi-column ILIKE with relevance o…
2 parents dfc5377 + 5c33109 commit 4071410

1 file changed

Lines changed: 21 additions & 2 deletions

File tree

backend/src/assets/assets.service.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,20 @@ export class AssetsService {
6161
.leftJoinAndSelect('asset.updatedBy', 'updatedBy');
6262

6363
if (search) {
64+
// Multi-column ILIKE search — covers name, assetId, serialNumber, location, notes,
65+
// category.name, department.name (case-insensitive, partial match).
66+
//
67+
// GIN index recommendations for production (run in a migration):
68+
// CREATE INDEX CONCURRENTLY idx_assets_name_gin ON assets USING gin(to_tsvector('english', name));
69+
// CREATE INDEX CONCURRENTLY idx_assets_serial_gin ON assets USING gin(to_tsvector('english', coalesce("serialNumber", '')));
6470
qb.andWhere(
65-
'(asset.name ILIKE :search OR asset.assetId ILIKE :search OR asset.serialNumber ILIKE :search OR asset.manufacturer ILIKE :search OR asset.model ILIKE :search)',
71+
`(asset.name ILIKE :search
72+
OR asset.assetId ILIKE :search
73+
OR asset.serialNumber ILIKE :search
74+
OR asset.location ILIKE :search
75+
OR asset.notes ILIKE :search
76+
OR category.name ILIKE :search
77+
OR department.name ILIKE :search)`,
6678
{ search: `%${search}%` },
6779
);
6880
}
@@ -71,7 +83,14 @@ export class AssetsService {
7183
if (categoryId) qb.andWhere('category.id = :categoryId', { categoryId });
7284
if (departmentId) qb.andWhere('department.id = :departmentId', { departmentId });
7385

74-
qb.orderBy('asset.createdAt', 'DESC')
86+
// Order by relevance (exact name match first) when searching; otherwise by creation date
87+
if (search) {
88+
qb.orderBy(`CASE WHEN asset.name ILIKE :exactSearch THEN 0 ELSE 1 END`, 'ASC', 'NULLS LAST')
89+
.addOrderBy('asset.createdAt', 'DESC');
90+
qb.setParameter('exactSearch', search);
91+
} else {
92+
qb.orderBy('asset.createdAt', 'DESC');
93+
}
7594
.skip((page - 1) * limit)
7695
.take(limit);
7796

0 commit comments

Comments
 (0)