MAX

Lenguaje de consulta de la búsqueda

Documentación: v0.29.0

Todos los campos, operadores, presets y límites de la búsqueda de mensajes de MAX, con reglas de fechas, expresiones regulares y la respuesta JSON para scripts y agentes.

La referencia de las consultas de max messages search, max messages stats y las búsquedas guardadas. Para ejemplos del día a día, empieza por buscar mensajes.

El lenguaje es un perfil estricto de la sintaxis de consultas de Apache Lucene: palabras, frases, AND/OR/NOT, grupos, campos, intervalos, comodines con límites y expresiones regulares. La referencia completa (en ruso) contiene las tablas generadas de campos, operadores, filtros preparados y límites, y ejemplos ejecutables; la especificación técnica describe la gramática y el compilador.

Operadores

OperadorEjemploSignificado
palabrasсчёт оплаченlas dos palabras
frase"счёт оплачен"las palabras en este orden
AND, &&alpha AND betalas dos
OR, ||alpha OR betacualquiera de las dos
NOT, !, -alpha NOT betala primera sin la segunda
++alpha OR betaalpha obligatoria, beta opcional
grupo(alpha OR beta) gammalos paréntesis fijan el orden
grupo de campofrom:(alice OR bob)el campo se aplica a cada valor
intervalodate:[2026-01-01 TO 2026-02-01}[ ] incluyen, { } excluyen, * abierto
comparaciónsize>10MB, date>=7dun intervalo abierto
comodínквартир*, т?кст* cualquier número de caracteres, ? uno
expresión regulartext:/pass(port)?/una expresión regular de Lucene con límites

alpha OR beta gamma significa (alpha OR beta) AND gamma; alpha OR beta AND gamma significa alpha OR (beta AND gamma). Usa paréntesis para evitar dudas. and, or y not en minúsculas son palabras normales. Una consulta con solo NOT no encuentra nada: añade una condición positiva, por ejemplo kind:group NOT preset:secret. La coincidencia difusa ~, la proximidad, la relevancia ponderada y los intervalos se rechazan con un error; no se ignoran.

Campos

CampoEncuentraEjemplo
textpalabras del mensaje (campo predeterminado)text:счёт
bodytodo el texto original, distinguiendo mayúsculasbody:/.*счёт.*/
fromremitente por nombre, @username o id; me eres túfrom:"Алиса Тестова"
chatchat por título, @username o idchat:"Книжный клуб"
datecuándo se enviódate:today, date:7d, date:[2026-01-01 TO 2026-02-01}
kindtipo de chat: private, group, channel, saved, bot, service, unknownkind:private
hasattachment, link, file, photo, image, video, audio, voice, sticker, contact, location, pollhas:file
topicun hilo de conversación; requiere un chatchat:"Книжный клуб" AND topic:42
inqué cuentas: proveedor o botsin:bots
presettexto parecido a un secreto o contactopreset:secret
contenttexto guardado del adjuntocontent:договор
filenamenombre completo del archivo adjuntofilename:*.pdf
mimetipo del adjunto; MAX no lo indicamime:image
sizetamaño en bytes o KB/MB/GB de 1024size>10MB
tagtu etiqueta local en el mensaje, su chat o su remitentetag:work

Los nombres de campo distinguen mayúsculas. Un campo, valor o combinación desconocidos son un error, nunca una respuesta vacía ni texto normal. Un nombre que el archivo local no conoce no se busca en MAX.

kind:bot selecciona un chat con un bot; in:bots selecciona los archivos de max bot. topic: requiere exactamente un chat en chat: o --chat: los números de tema se repiten entre chats. filename, mime y size coinciden con un mensaje si coincide al menos uno de sus archivos. MAX no indica los tipos de archivo, así que mime: no encuentra nada aquí: busca por extensión.

Filtros preparados

FiltroUn candidato es
passworduna etiqueta de contraseña seguida de un valor
codeuna etiqueta de código de verificación y de 4 a 8 cifras
api-keyuna etiqueta de clave de API y un valor
secretuna etiqueta de contraseña, secreto, token o clave de API y un valor
cardde 13 a 19 cifras, con espacios o guiones opcionales
bankun valor con forma de IBAN
passportun valor de pasaporte con etiqueta o la forma rusa de 4+6 cifras
phoneun teléfono internacional con prefijo +
emailuna forma de dirección de correo electrónico
telegram-linkun enlace t.me o telegram.me
urlun enlace HTTP(S)
contactun contacto adjunto, o un correo electrónico o un teléfono
locationuna ubicación adjunta o un enlace geo:

Un filtro preparado señala un candidato por su forma. No verifica una contraseña, una tarjeta ni un documento, y puede coincidir con algo inofensivo. No borres ni reenvíes mensajes de forma automática solo por su resultado.

Fechas

--timezone acepta una zona IANA como Europe/Madrid; sin ella se usa la zona del equipo, que se devuelve en la respuesta. Una fecha sin hora es un día natural completo. Un límite superior inclusivo incluye todo ese día; uno exclusivo lo excluye; un día con cambio de hora puede durar 23 o 25 horas.

date:today y date:yesterday son días naturales. date:7d significa desde hace 7 días hasta ahora (también 30m, 2h); date>=7d y date:[30d TO 7d} funcionan en comparaciones e intervalos, contados desde el momento en que se ejecuta la consulta. Una hora exacta va entre comillas, con segundos y desplazamiento horario: date>="2026-01-01T10:00:00+02:00".

Palabras, comodines y expresiones regulares

Antes de indexarlo y buscarlo, el texto se convierte a minúsculas y pierde los acentos; ё pasa a е, y й a и. Por eso coinciden algunas palabras distintas: мой también encuentra «мои». Las expresiones regulares y los comodines de text: se normalizan igual.

text:/счёт/ coincide con la palabra completa «счёт», pero no con «счётом». body:/счёт/ coincide solo con un mensaje cuyo texto completo es «счёт», distinguiendo mayúsculas; para encontrarla en cualquier posición, usa body:/.*счёт.*/, y para el comienzo de una frase, body:/.*[Сс]чёт.*/. Es la sintaxis de expresiones regulares de Lucene, sin lookaround, referencias inversas, anclas ni indicadores de JavaScript.

En un archivo grande, un prefijo corto como к* puede abarcar más de 10 000 palabras y se rechaza; alárgalo. Las consultas largas, el anidamiento profundo, los patrones grandes y los recorridos lentos se rechazan con query_limit, no se recortan: limita el chat, las fechas o el patrón.

La respuesta

--json devuelve { items, page, limit, hasMore, corrections, completeness, wordsReady, query, coverage }, aunque no haya coincidencias. --jsonl emite solo los elementos.

  • query: la versión del lenguaje, la zona horaria y el orden usados.
  • coverage: en qué cuentas y chats se buscó. lastSyncedAt es el momento más antiguo en que store fetch descargó un chat del ámbito, o null si alguno no se descargó nunca. inventoryComplete significa que cada cuenta del ámbito ha listado alguna vez todos sus chats; no garantiza un historial completo.
  • completeness: por chat, si su historial guardado llega al principio y si tiene huecos.
  • wordsReady: si el índice de palabras está completo. Cuando es false, una consulta con palabras falla con index_not_ready y el comando que lo termina, max store migrate; una consulta sin palabras se ejecuta.
  • hasMore se refiere a la página, no a si MAX tiene más.

Un error incluye la posición del problema en la consulta y una pista.

En MCP

max_messages_search acepta la consulta como text o como árbol sintáctico versionado en ast (no ambos); language elige lucene o legacy, y timezone establece la zona horaria del calendario. chat admite un id o un nombre guardado; source, newest, context y limit funcionan como las opciones de la orden. record: false excluye la llamada del historial de consultas. La respuesta tiene los mismos campos que --json. max_messages_stats cuenta las coincidencias de esas mismas consultas.

Los modos anteriores

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

--language legacy conserva los filtros anteriores y su corrección de erratas. --regex es un modo aparte: una expresión regular de JavaScript, sin distinguir mayúsculas, sobre el texto completo, en un proceso aislado con límites de tiempo y tamaño. --regex no se puede combinar con --language lucene.

AnteriorEstricto
after:2026-01-01date:[2026-01-01 TO *]
before:2026-02-01date:[* TO 2026-02-01}
after:7ddate:7d
prefijo y corrección de erratas automáticosквартир* de forma explícita; erratas solo en --language legacy

--thread sigue el grafo de respuestas guardado; en messages context sustituye a los mensajes vecinos en orden cronológico. Los valores predeterminados son 8 saltos, 50 mensajes, 65 536 bytes y un día alrededor de cada resultado. Cámbialos con --thread-hops, --thread-messages, --thread-bytes y --thread-within. Sin grafo, vuelve al contexto cronológico; los enlaces desactualizados se marcan y no se recorren.

Por defecto, la búsqueda lee el archivo local. --sync-first descarga de forma explícita los mensajes nuevos antes de buscar y no marca nada como leído: como máximo 5 chats, 500 mensajes y 30 segundos. Cambia estos límites con --max-chats, --max-messages y --sync-time. Si la actualización falla o queda incompleta, se conservan los resultados locales, con la cobertura desactualizada y los detalles de la actualización.

MCP usa thread, thread_hops, thread_messages, thread_bytes, thread_within y sync_first. sync_first solo está disponible con messages.sync-first: allow. Un messages_context normal con offline: true lee los mensajes guardados.