Не для того, чтобы подорвать ваш вопрос, но 28 тысяч записей на самом деле не так уж много. Возможно, вы оптимизируете преждевременно?
Сначала я хотел бы использовать «обычные» индексы в таблице БД. Используемая ими жесткая эвристика, как правило, очень эффективна и не тривиальна, чтобы ее победить (или, если вы можете, действительно ли она стоит усилий вовремя и достаточно ли велика прибыль?).
Кроме того, в зависимости от того, где вы в действительности выполняете запрос тега, действительно ли пользователь замечает выигрыш в 200 мс, оптимизированный для вас?
Сначала измерьте, затем оптимизируйте: -)
EDIT
Без БД у меня, вероятно, была бы основная таблица, содержащая все теги вместе с идентификатором (если это возможно, для хранения в памяти). Держите отсортированный список идентификаторов вместе с каждым сообщением.
Не уверен, какой объем памяти, основанный на общности, поможет. Сортированный список, в котором вы можете выполнять обычный двоичный поиск, может оказаться достаточно быстрым; мера: -)
Здесь вам нужно будет повторить все сообщения для каждого запроса тега.
Если это приводит к замедлению, вы можете прибегнуть к хранению кармана идентификаторов записей для каждого тега. Эта структура данных может стать несколько большой и может потребовать файл для поиска и чтения.
Для таблицы меньшего размера вы можете создать таблицу на основе хешированного значения (с дубликатами). Таким образом, вы можете использовать его, чтобы быстро перейти к меньшему списку кандидатов, которые нуждаются в дальнейшей проверке, чтобы увидеть, совпадают они или нет.