From e835e4e8df3e59754d50ad91a860efa4d72260c7 Mon Sep 17 00:00:00 2001 From: RISHAV DEWAN Date: Wed, 10 Jun 2026 14:06:47 +0530 Subject: [PATCH 1/2] fix(search): extend messages text index to include attachment fields Closes #2938 --- .changeset/fix-search-attachment-fields.md | 5 +++++ .../server/startup/ensureMessagesTextIndex.ts | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 .changeset/fix-search-attachment-fields.md diff --git a/.changeset/fix-search-attachment-fields.md b/.changeset/fix-search-attachment-fields.md new file mode 100644 index 0000000000000..58aeaef592f43 --- /dev/null +++ b/.changeset/fix-search-attachment-fields.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fix: Message search now includes attachment text fields (text, title, description, pretext, author_name) in the MongoDB text index so searching works on post attachments, not just message body. diff --git a/apps/meteor/server/startup/ensureMessagesTextIndex.ts b/apps/meteor/server/startup/ensureMessagesTextIndex.ts index 2ac96f976fc11..d9ea2a4d75376 100644 --- a/apps/meteor/server/startup/ensureMessagesTextIndex.ts +++ b/apps/meteor/server/startup/ensureMessagesTextIndex.ts @@ -4,12 +4,29 @@ import { SystemLogger } from '../lib/logger/system'; const { USE_ROOM_SEARCH_INDEX = 'false' } = process.env; +const ATTACHMENT_TEXT_FIELDS = [ + 'attachments.text', + 'attachments.title', + 'attachments.description', + 'attachments.pretext', + 'attachments.author_name', +] as const; + +const TEXT_INDEX_FIELDS = { msg: 'text' as const, ...Object.fromEntries(ATTACHMENT_TEXT_FIELDS.map((f) => [f, 'text' as const])) }; + // MongoDB stores a text index's key with `_fts: 'text'` / `_ftsx: 1` placeholders // and tracks the original text fields in `weights`. Classify by looking at the // non-placeholder prefix fields plus weights. const classifyTextIndex = (idx: { key: Record; weights?: Record }) => { const { weights, key } = idx; - if (weights?.msg !== 1 || Object.keys(weights).length !== 1) { + + const expectedWeightKeys = Object.keys(TEXT_INDEX_FIELDS); + const actualWeightKeys = Object.keys(weights ?? {}); + + if ( + actualWeightKeys.length !== expectedWeightKeys.length || + !expectedWeightKeys.every((k) => weights?.[k] === 1) + ) { return 'other'; } @@ -79,7 +96,7 @@ export const ensureMessagesTextIndex = async (): Promise => { shape: desiredShape, }); try { - const name = await Messages.col.createIndex(desiredShape === 'room-scoped' ? { rid: 1, msg: 'text' } : { msg: 'text' }); + const name = await Messages.col.createIndex(desiredShape === 'room-scoped' ? { rid: 1, ...TEXT_INDEX_FIELDS } : TEXT_INDEX_FIELDS); SystemLogger.startup({ msg: 'created messages text index', name, shape: desiredShape }); } catch (err) { SystemLogger.error({ msg: 'failed to create messages text index', shape: desiredShape, err }); From 05307270c3378fe505ae7ffd8f0b93edbf8f21db Mon Sep 17 00:00:00 2001 From: RISHAV DEWAN Date: Wed, 10 Jun 2026 18:21:06 +0530 Subject: [PATCH 2/2] fix(search): add explicit index name to avoid 127-byte namespace limit Auto-generated names for large text indexes can exceed MongoDB's 127-byte limit on older versions/FCV, causing startup failure. Explicit short names prevent this. --- apps/meteor/server/startup/ensureMessagesTextIndex.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/meteor/server/startup/ensureMessagesTextIndex.ts b/apps/meteor/server/startup/ensureMessagesTextIndex.ts index d9ea2a4d75376..a98fc37790b1d 100644 --- a/apps/meteor/server/startup/ensureMessagesTextIndex.ts +++ b/apps/meteor/server/startup/ensureMessagesTextIndex.ts @@ -96,7 +96,10 @@ export const ensureMessagesTextIndex = async (): Promise => { shape: desiredShape, }); try { - const name = await Messages.col.createIndex(desiredShape === 'room-scoped' ? { rid: 1, ...TEXT_INDEX_FIELDS } : TEXT_INDEX_FIELDS); + const name = await Messages.col.createIndex( + desiredShape === 'room-scoped' ? { rid: 1, ...TEXT_INDEX_FIELDS } : TEXT_INDEX_FIELDS, + { name: desiredShape === 'room-scoped' ? 'messages_text_room' : 'messages_text' }, + ); SystemLogger.startup({ msg: 'created messages text index', name, shape: desiredShape }); } catch (err) { SystemLogger.error({ msg: 'failed to create messages text index', shape: desiredShape, err });