Язык поисковых запросов
Документация: 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 beta | alpha обязательно, beta — нет |
| группа | (alpha OR beta) gamma | скобки задают порядок |
| группа поля | from:(alice OR bob) | поле относится к каждому значению |
| диапазон | date:[2026-01-01 TO 2026-02-01} | [ ] включают, { } исключают, * — без границы |
| сравнение | size>10MB, date>=7d | открытый диапазон |
| шаблон | квартир*, т?кст | * — любые символы, ? — один |
| regex | text:/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. Нечёткий поиск ~, близость слов, веса и интервалы дают ошибку, а не
пропускаются.
Поля
Имена полей различают регистр. Неизвестное поле, значение или сочетание — ошибка, а не пустой ответ и не обычный текст. Имя, которого нет в архиве, у 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 и значение |
card | 13–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-01 | date:[2026-01-01 TO *] |
before:2026-02-01 | date:[* TO 2026-02-01} |
after:7d | date: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 читает
сохранённое.