diff --git a/packages/backend/src/core/SearchService.ts b/packages/backend/src/core/SearchService.ts
index 6b9a6d5460..2a241d2e31 100644
--- a/packages/backend/src/core/SearchService.ts
+++ b/packages/backend/src/core/SearchService.ts
@@ -29,7 +29,8 @@ type Q =
 	{ op: 'is not null', k: K} |
 	{ op: 'and', qs: Q[] } |
 	{ op: 'or', qs: Q[] } |
-	{ op: 'not', q: Q };
+	{ op: 'not', q: Q } |
+	{ op: 'in', qs: Q[] };
 
 function compileValue(value: V): string {
 	if (typeof value === 'string') {
@@ -93,6 +94,7 @@ export class SearchService {
 					'userHost',
 					'channelId',
 					'tags',
+					'attachedFileTypes',
 				],
 				typoTolerance: {
 					enabled: false,
@@ -138,6 +140,7 @@ export class SearchService {
 				cw: note.cw,
 				text: note.text,
 				tags: note.tags,
+				attachedFileTypes: note.attachedFileTypes,
 			}], {
 				primaryKey: 'id',
 			});
@@ -182,6 +185,44 @@ export class SearchService {
 					filter.qs.push({ op: '=', k: 'userHost', v: opts.host });
 				}
 			}
+			if (opts.filetype) {
+				if (opts.filetype === 'image') {
+					filter.qs.push({ op: 'or', qs: [
+						{ op: '=', k: 'attachedFileTypes', v: 'image/webp' }, 
+						{ op: '=', k: 'attachedFileTypes', v: 'image/png' },
+						{ op: '=', k: 'attachedFileTypes', v: 'image/jpeg' },
+						{ op: '=', k: 'attachedFileTypes', v: 'image/avif' },
+						{ op: '=', k: 'attachedFileTypes', v: 'image/apng' },
+						{ op: '=', k: 'attachedFileTypes', v: 'image/gif' },
+					] });
+				} else if (opts.filetype === 'video') {
+					filter.qs.push({ op: 'or', qs: [
+						{ op: '=', k: 'attachedFileTypes', v: 'video/mp4' }, 
+						{ op: '=', k: 'attachedFileTypes', v: 'video/webm' },
+						{ op: '=', k: 'attachedFileTypes', v: 'video/mpeg' },
+						{ op: '=', k: 'attachedFileTypes', v: 'video/x-m4v' },
+					] });
+				} else if (opts.filetype === 'audio') {
+					filter.qs.push({ op: 'or', qs: [
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/mpeg' }, 
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/flac' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/wav' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/aac' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/webm' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/opus' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/ogg' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/x-m4a' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/mod' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/s3m' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/xm' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/it' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/x-mod' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/x-s3m' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/x-xm' },
+						{ op: '=', k: 'attachedFileTypes', v: 'audio/x-it' },
+					] });
+				}
+			}
 			const res = await this.meilisearchNoteIndex!.search(q, {
 				sort: [`createdAt:${opts.order ? opts.order : 'desc'}`],
 				matchingStrategy: 'all',
diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts
index f75249bfb0..06efa3d951 100644
--- a/packages/backend/src/server/api/endpoints/notes/search.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search.ts
@@ -75,7 +75,6 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
 				host: ps.host,
 				filetype: ps.filetype,
 				order: ps.order,
-				disableMeili: ps.filetype ? true : false,
 			}, {
 				untilId: ps.untilId,
 				sinceId: ps.sinceId,