Skip to content

Commit e4b3a80

Browse files
committed
feat: refactor search services to use text search and improve logging in SearchQueryDTO
1 parent 2af37e7 commit e4b3a80

File tree

4 files changed

+47
-65
lines changed

4 files changed

+47
-65
lines changed

server/src/search/search.service.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,32 @@ export class SearchService {
2020
}
2121

2222
public async search(queryBody: SearchQueryDTO) {
23-
this.logger.debug(`Searching for ${JSON.stringify(queryBody)}`);
24-
2523
queryBody.query = (queryBody.query || '').trim().toLowerCase();
2624

2725
const {
2826
query,
2927
page = 1,
3028
limit = 10,
3129
sort,
32-
order = false,
30+
order,
3331
category,
3432
searchSongs,
3533
searchUsers,
3634
} = queryBody;
3735

36+
this.logger.debug(
37+
`Searching for ${JSON.stringify({
38+
query,
39+
page,
40+
limit,
41+
sort,
42+
order,
43+
category,
44+
searchSongs,
45+
searchUsers,
46+
})}`,
47+
);
48+
3849
const { users, total: totalUsers } = searchUsers
3950
? await this.userService.search({
4051
...queryBody,

server/src/song/song.service.ts

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -479,25 +479,19 @@ export class SongService {
479479

480480
const songs: SongViewDto[] = await this.songModel.aggregate([
481481
{
482-
/**
483-
$search: {
484-
index: 'song_search_index',
485-
text: {
486-
query: query,
487-
},
488-
},
489-
*/
490482
$match: {
491-
$or: [
492-
{ originalAuthor: { $regex: query, $options: 'i' } },
493-
{ title: { $regex: query, $options: 'i' } },
494-
{ description: { $regex: query, $options: 'i' } },
495-
],
496-
//category: category,
483+
$text: {
484+
$search: query,
485+
$caseSensitive: false,
486+
$diacriticSensitive: false,
487+
},
488+
...(category && { category: category }),
497489
},
498490
},
499491
{
500-
$sort: { [sort]: sortOrder },
492+
$sort: {
493+
[sort]: sortOrder,
494+
},
501495
},
502496
{
503497
$skip: skip,
@@ -550,12 +544,12 @@ export class SongService {
550544
},
551545
*/
552546
$match: {
553-
$or: [
554-
{ originalAuthor: { $regex: query, $options: 'i' } },
555-
{ title: { $regex: query, $options: 'i' } },
556-
{ description: { $regex: query, $options: 'i' } },
557-
],
558-
category: category,
547+
$text: {
548+
$search: query,
549+
$caseSensitive: false, // Case-insensitive search
550+
$diacriticSensitive: false, // Diacritic-insensitive search
551+
},
552+
...(category && { category: category }),
559553
},
560554
},
561555
{

server/src/user/user.service.ts

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -77,23 +77,12 @@ export class UserService {
7777
profileImage: string;
7878
}[] = await this.userModel.aggregate([
7979
{
80-
/*
81-
$search: {
82-
index: 'user_search_index',
83-
text: {
84-
query: query,
85-
path: {
86-
wildcard: '*',
87-
},
88-
},
89-
},
90-
*/
9180
$match: {
92-
$or: [
93-
{ username: { $regex: query, $options: 'i' } },
94-
{ publicName: { $regex: query, $options: 'i' } },
95-
// { description: { $regex: query, $options: 'i' } },
96-
],
81+
$text: {
82+
$search: query,
83+
$caseSensitive: false,
84+
$diacriticSensitive: false,
85+
},
9786
},
9887
},
9988
{
@@ -103,31 +92,24 @@ export class UserService {
10392
},
10493
},
10594
{
106-
$sort: { [sort]: sortOrder }, // Sort the results
95+
$sort: { [sort]: sortOrder },
10796
},
10897
{
109-
$skip: skip, // Skip the first 'skip' results
98+
$skip: skip,
11099
},
111100
{
112-
$limit: limit, // Limit the results to 'limit'
101+
$limit: limit,
113102
},
114103
]);
115104

116105
const totalResult = await this.userModel.aggregate([
117106
{
118-
/*
119-
$search: {
120-
index: 'user_search_index',
121-
text: {
122-
query: query,
123-
},
124-
},*/
125107
$match: {
126-
$or: [
127-
{ username: { $regex: query, $options: 'i' } },
128-
{ publicName: { $regex: query, $options: 'i' } },
129-
// { description: { $regex: query, $options: 'i' } },
130-
],
108+
$text: {
109+
$search: query,
110+
$caseSensitive: false,
111+
$diacriticSensitive: false,
112+
},
131113
},
132114
},
133115
{

shared/validation/common/dto/SearchQuery.dto.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export class SearchQueryDTO {
1515
@ApiProperty({
1616
example: 'Nirvana - Dumb',
1717
description: 'Natural language query.',
18-
required: false,
1918
})
2019
query?: string;
2120

@@ -32,17 +31,15 @@ export class SearchQueryDTO {
3231
@ApiProperty({
3332
example: 1,
3433
description: 'Page number.',
35-
required: false,
3634
})
37-
page?: number = 1;
35+
page?: number;
3836

3937
@IsNumber({ maxDecimalPlaces: 0 })
4038
@Min(1)
4139
@Max(100)
4240
@ApiProperty({
4341
example: 20,
4442
description: 'Number of results per page.',
45-
required: false,
4643
})
4744
limit?: number = 20;
4845

@@ -53,7 +50,7 @@ export class SearchQueryDTO {
5350
description: 'Sort field.',
5451
required: false,
5552
})
56-
sort?: string = 'createdAt';
53+
sort?: string;
5754

5855
@IsBoolean()
5956
@Transform(({ value }) => value === 'true')
@@ -62,25 +59,23 @@ export class SearchQueryDTO {
6259
description: 'Sort in ascending order if true, descending if false.',
6360
required: false,
6461
})
65-
order?: boolean = false;
62+
order?: boolean;
6663

6764
@IsOptional()
6865
@IsBoolean()
6966
@ApiProperty({
7067
example: true,
7168
description: 'Search Users.',
72-
required: false,
7369
})
74-
searchUsers?: boolean = true;
70+
searchUsers?: boolean;
7571

7672
@IsOptional()
7773
@IsBoolean()
7874
@ApiProperty({
7975
example: true,
8076
description: 'Search Songs.',
81-
required: false,
8277
})
83-
searchSongs?: boolean = true;
78+
searchSongs?: boolean;
8479

8580
constructor(partial: Partial<SearchQueryDTO>) {
8681
Object.assign(this, partial);

0 commit comments

Comments
 (0)