MAX

Язык поисковых запросов

Документация: v0.29.0

Все поля, операторы, пресеты и ограничения поиска сообщений MAX: правила дат, регулярные выражения и JSON-ответ для скриптов и агентов.

Справка по запросам max messages search, max messages stats и сохранённых поисков. Примеры на каждый день — в поиске сообщений.

Язык — строгий профиль синтаксиса Apache Lucene: слова, фразы, AND/OR/NOT, группы, поля, диапазоны, ограниченные шаблоны и регулярные выражения. Полная справка содержит генерируемые таблицы полей, операторов, preset и пределов и проверяемые примеры; техническая спецификация описывает грамматику и компилятор.

Операторы

ОператорПримерЗначение
словасчёт оплаченоба слова
фраза"счёт оплачен"слова в этом порядке
AND, &&alpha AND betaоба
OR, ||alpha OR betaлюбое
NOT, !, -alpha NOT betaпервое без второго
++alpha OR betaalpha обязательно, beta — нет
группа(alpha OR beta) gammaскобки задают порядок
группа поляfrom:(alice OR bob)поле относится к каждому значению
диапазонdate:[2026-01-01 TO 2026-02-01}[ ] включают, { } исключают, * — без границы
сравнениеsize>10MB, date>=7dоткрытый диапазон
шаблонквартир*, т?кст* — любые символы, ? — один
regextext:/pass(port)?/ограниченное регулярное выражение Lucene

alpha OR beta gamma означает (alpha OR beta) AND gamma; alpha OR beta AND gamma — alpha OR (beta AND gamma). Для ясности ставьте скобки. and, or, not строчными — обычные слова. Запрос из одного NOT ничего не находит: добавьте положительное условие, например kind:group NOT preset:secret. Нечёткий поиск ~, близость слов, веса и интервалы дают ошибку, а не пропускаются.

Поля

ПолеЧто находитПример
textслова сообщения (поле по умолчанию)text:счёт
bodyвесь исходный текст, с учётом регистраbody:/.*счёт.*/
fromотправителя: по имени, @username или id; me — выfrom:"Алиса Тестова"
chatчат: по названию, @username или idchat:"Книжный клуб"
dateкогда отправленоdate:today, date:7d, date:[2026-01-01 TO 2026-02-01}
kindвид чата: private, group, channel, saved, bot, service, unknownkind:private
hasattachment, link, file, photo, image, video, audio, voice, sticker, contact, location, pollhas:file
topicодну ветку обсуждения; нужен один чатchat:"Книжный клуб" AND topic:42
inкакие аккаунты: провайдер или botsin:bots
presetтекст, похожий на секрет или контактpreset:secret
contentсохранённый текст вложенияcontent:договор
filenameимя вложенного файла целикомfilename:*.pdf
mimeтип вложенного файла; MAX его не сообщаетmime:image
sizeразмер вложенного файла: байты или KB/MB/GB по 1024size>10MB
tagваша локальная метка на сообщении, его чате или отправителеtag:work

Имена полей различают регистр. Неизвестное поле, значение или сочетание — ошибка, а не пустой ответ и не обычный текст. Имя, которого нет в архиве, у MAX не спрашивается.

kind:bot выбирает чат с ботом, in:bots — архивы ботов max bot. topic: требует ровно одного чата в chat: или --chat: номера веток повторяются в разных чатах. filename, mime и size подходят сообщению, если подходит хотя бы один его файл. MAX не сообщает тип файла, поэтому mime: здесь ничего не находит — ищите по расширению.

Preset

PresetКандидат — это
passwordподпись пароля и значение после неё
codeподпись кода подтверждения и 4–8 цифр
api-keyподпись ключа API и значение
secretподпись пароля, секрета, токена или ключа API и значение
card13–19 цифр, можно с пробелами или дефисами
bankзначение вида IBAN
passportподписанный номер паспорта или российский вид 4+6 цифр
phoneмеждународный телефон с плюсом
emailадрес электронной почты
telegram-linkссылка t.me или telegram.me
urlссылка HTTP(S)
contactвложение-контакт, email или телефон
locationвложение-место или ссылка geo:

Preset сообщает кандидата по виду. Он не проверяет пароль, карту или документ и может совпасть с безобидным текстом. Не удаляйте и не пересылайте сообщения автоматически по его ответу.

Даты

--timezone принимает пояс IANA, например Europe/Madrid; без него берётся пояс компьютера, и ответ его называет. Дата без времени — весь календарный день. Включающая верхняя граница включает день целиком, исключающая — исключает; день перехода на летнее время длится 23 или 25 часов.

date:today и date:yesterday — календарные дни. date:7d — от 7 дней назад до сейчас (также 30m, 2h); date>=7d и date:[30d TO 7d} работают в сравнении и диапазоне, отсчёт — от момента запроса. Точное время пишите в кавычках, с секундами и смещением: date>="2026-01-01T10:00:00+02:00".

Слова, шаблоны и регулярные выражения

Перед индексом и поиском текст приводится к нижнему регистру и теряет ударения; ё становится е, й — и. Поэтому некоторые разные слова совпадают: мой находит и «мои». Regex и шаблоны по text: приводятся так же.

text:/счёт/ совпадает с целым словом «счёт», но не со «счётом». body:/счёт/ совпадает только с сообщением, весь текст которого — «счёт», с учётом регистра; чтобы найти где угодно, пишите body:/.*счёт.*/, а для начала предложения — body:/.*[Сс]чёт.*/. Это синтаксис регулярных выражений Lucene, без lookaround, обратных ссылок, якорей и флагов JavaScript.

На большом архиве короткий шаблон вроде к* раскрывается больше чем в 10 000 слов и отвергается — удлините его. Длинные запросы, глубокая вложенность, большие шаблоны и медленный перебор отвергаются ошибкой query_limit, а не обрезаются: сузьте чат, даты или шаблон.

Ответ

--json возвращает { items, page, limit, hasMore, corrections, completeness, wordsReady, query, coverage }, даже без совпадений. --jsonl выдаёт только сообщения, построчно.

  • query — версия языка, часовой пояс и порядок.
  • coverage — какие аккаунты и чаты просмотрены. lastSyncedAt — самое старое время, когда чат из охвата скачивал store fetch; null, если хотя бы один не скачивался ни разу. inventoryComplete значит, что каждый аккаунт охвата хотя бы раз передал полный список чатов; полноту истории это не обещает.
  • completeness — по каждому чату: доходит ли сохранённая история до начала и есть ли пропуски.
  • wordsReady — достроен ли индекс слов. При false запрос со словами даёт index_not_ready и команду, которая его достроит, max store migrate; запрос без слов работает.
  • hasMore говорит о странице, а не о том, есть ли в MAX ещё.

Ошибка указывает место в запросе и подсказку.

В MCP

max_messages_search принимает запрос как text или как синтаксическое дерево с версией в ast (не оба сразу); language выбирает lucene или legacy, timezone — календарный пояс. chat принимает id или сохранённое название; source, newest, context и limit работают как опции команды. record: false не записывает вызов в историю запросов. Ответ содержит те же поля, что --json. max_messages_stats считает по тем же запросам.

Прежние режимы

max messages search 'from:alice after:7d invoice -draft' --language legacy --json
max messages search --regex 'invoice\s+\d+' --json

--language legacy сохраняет прежние фильтры и исправление опечаток. --regex — отдельный режим: регулярное выражение JavaScript без учёта регистра по всему тексту, в изолированном процессе, с пределами времени и размера. --regex нельзя сочетать с --language lucene.

LegacyСтрогий
after:2026-01-01date:[2026-01-01 TO *]
before:2026-02-01date:[* TO 2026-02-01}
after:7ddate:7d
начало слова и опечатки автоматическиквартир* явно; опечатки — только в --language legacy

--thread добавляет цепочку ответов и связанные сообщения из сохранённого графа; у messages context заменяет соседей по времени. Пределы: 8 переходов, 50 сообщений, 65 536 байт и сутки по обе стороны. Их меняют --thread-hops, --thread-messages, --thread-bytes, --thread-within. Если графа нет, используется контекст по времени; устаревшие связи помечаются и не обходятся.

По умолчанию поиск читает только архив. --sync-first сначала скачивает новые сообщения, ничего не помечая прочитанным: не больше 5 чатов, 500 сообщений и 30 секунд. Пределы меняют --max-chats, --max-messages, --sync-time. Неполное или неудачное обновление сохраняет локальную выдачу и сообщает об устаревшем покрытии и результате обновления.

В MCP используются thread, thread_hops, thread_messages, thread_bytes, thread_within и sync_first. sync_first доступен только при messages.sync-first: allow. Обычный messages_context с offline: true читает сохранённое.