# Язык запросов (/ru/docs/wa/query-language)

Если вы используете ИИ-агент с `wa`, вам не нужно изучать этот язык: опишите то, что вы хотите, простыми словами, и агент напишет запрос. Эта страница предназначена для людей, которые сами вводят поисковые запросы, и для всех, кому нужны все фильтры: точные операторы, каждое поле, предустановки, правила дат и ограничения.

Это ссылка на запросы `wa personal search messages`, `wa personal search all`, `wa personal stats messages show` и сохраненные поисковые запросы. Для повседневных примеров начните с [search](/llms.mdx/docs/ru/wa/search/content.md).

Термины, используемые на этой странице:

* **Запрос**: текст, который вы ищете, например `invoice from:me date:7d`.
* **Поле**: имя и двоеточие, которые ограничивают одну часть запроса одним свойством сообщения, например `from:` (отправитель) или `date:` (когда оно было отправлено). Слова без поля ищут текст сообщения.
* **Оператор**: слово или знак, объединяющий условия, например `AND`, `OR` и `NOT`.
* **Словоформы**: одно и то же слово с разными окончаниями. `piso` и `pisos` — формы одного слова.

Этот язык используется всеми интерфейсами командной строки WireCat. Это строгий профиль синтаксиса запросов Apache Lucene: слова, фразы, И/ИЛИ/НЕ, группы, поля, диапазоны, ограниченные подстановочные знаки и регулярные выражения. «Строгий» означает, что все, что он не поддерживает, является ошибкой, которую никогда не игнорируют молча. В [полной ссылке](https://github.com/WireCatLabs/cli-core/blob/main/docs/search/query-language.md) (на русском языке) есть сгенерированные таблицы полей, операторов, пресетов и ограничений, а также исполняемые примеры.

## Что он может сделать [#что-он-может-сделать]

| Вы хотите | Написать |
| --- | --- |
| сообщения со всеми этими словами в любой форме | `invoice paid` |
| эти слова вместе, в таком порядке | `"invoice paid"` |
| то или иное слово, без третьего | `(cafe OR library) NOT loud` |
| только эта точная форма слова | `exact:piso` или `--exact` для каждого слова без поля |
| слова, начинающиеся с чего-то | `invo*` |
| отправитель, чат, разновидность чата | `from:me`, `chat:"Book club"`, `kind:private` |
| период | `date:7d`, `date:[2026-01-01 TO 2026-02-01}` |
| текст, похожий на пароль, карту или телефон | `preset:secret`, `preset:card` |
| ваши собственные лейблы | `tag:work` |
| узор | `text:/pass(port)?/` |

Слова и словосочетания без полей соответствуют словоформам. `--exact` выбирает точные формы слов без поля; явный `text:` по-прежнему соответствует формам. Языковые настройки хранилища определяют, какие формы совпадают ([формы слов](/llms.mdx/docs/ru/wa/archive/content.md#repair-and-index-maintenance)).

## Операторы [#операторы]

| Оператор | Пример | Значение |
| --- | --- | --- |
| слова | `invoice paid` | оба слова |
| фраза | `"invoice paid"` | слова в этом порядке |
| `AND`, `&&` | `alpha AND beta` | оба |
| `OR`, `\|\|` | `alpha OR beta` | либо |
| `NOT`, `!`, `-` | `alpha NOT beta` | первое без второго |
| `+` | `+alpha OR beta` | требуется альфа-версия, бета-версия необязательна |
| группа | `(alpha OR beta) gamma` | скобки задают порядок |
| группа полей | `from:(alice OR bob)` | поле применяется к каждому значению |
| диапазон | `date:[2026-01-01 TO 2026-02-01}` | `[ ]` включить, `{ }` исключить, `*` открыть |
| сравнение | `date>=7d`, `date:>=7d` | открытый полигон; форма двоеточия такая же |
| подстановочный знак | `invo*`, `te?t` | `*` любые символы, `?` один |
| регулярное выражение | `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`. Нечеткие `~`, близость, повышение и интервалы отклоняются с ошибкой, а не игнорируются. Опечатки не исправлены: чтобы уловить несколько окончаний, используйте подстановочный знак, например `invo*`.

## Поля [#поля]

| Поле | Находки | Пример |
| --- | --- | --- |
| `text` | слова сообщения (поле по умолчанию) | `text:invoice` |
| `exact` | точная форма слова или фразы | `exact:piso`, `exact:"invoice paid"` |
| `body` | весь исходный текст с учетом регистра | `body:/.*invoice.*/` |
| `from` | отправитель, по имени или идентификатору; `me` это ты | `from:"Alice Synthetic"`, `from:"100000000000001@lid"` |
| `chat` | чат по имени или идентификатору | `chat:"Book club"`, `chat:120363000000000001@g.us` |
| `date` | когда оно было отправлено | `date:today`, `date:7d`, `date:[2026-01-01 TO 2026-02-01}` |
| `kind` | вид чата: `private`, `group`, `channel`, `saved` и общий отдых | `kind:private` |
| `has` | `link` и типы файлов общего языка | `has:link` |
| `in` | какие счета: провайдер | `in:whatsapp` |
| `preset` | текст в форме секрета или контактной информации | `preset:secret` |
| `tag` | ваш собственный локальный тег в сообщении, его чате или отправителе | `tag:work` |
| `phone` | номер телефона найден в тексте, как бы он ни был написан | `phone:"<phone>"` |
| `email` | адрес электронной почты, найденный в тексте | `email:"ana@example.com"` |
| `url` | ссылка, найденная в тексте, без параметров отслеживания | `url:"https://example.com/a"` |
| `domain` | сайт ссылки или адреса, найденного в тексте | `domain:example.com` |
| `mentions`[↗](/llms.mdx/docs/ru/wa/commands-personal/content.md#wa-mentions "Справочник команды: wa mentions") | человек, организация или документ, с которым связано найденное упоминание | `mentions:"person:12"` |

Имена полей чувствительны к регистру. Неизвестное поле, значение или комбинация — это ошибка, а не пустой ответ и никогда не простой текст. Имя, которое не известно в локальном хранилище, не ищется в WhatsApp.

В WhatsApp `kind:private` — это индивидуальный чат, `kind:group` — групповой, `kind:saved` — чат с самим собой, а `kind:channel` — канал WhatsApp. Цитируйте идентификатор: `@` — оператор. Поля файлов — `content`, `filename`, `mime`, `size` и `has:` с `file`, `photo`, `voice` и другими типами вложений — соответствуют файлам сообщений, сохраненных с тех пор. `wa` обрабатываемые файлы; `content:` необходимо сначала прочитать текст файла ([вложения файлов](/llms.mdx/docs/ru/wa/attachments/content.md)). `topic:` не имеет ничего общего: в WhatsApp нет тем на форуме.

## Упоминания [#упоминания]

`wa` находит телефоны, адреса электронной почты, ссылки, документы и имена людей в сохраненных сообщениях. Используйте эти поля, чтобы найти сообщения, которые их содержат. Сами находки указаны под номером `wa personal mentions list`. Чтобы найти телефон, сначала напишите номер `number.txt` в одну строку.

```sh
wa personal search messages "phone:\"$(cat number.txt)\""
wa personal search messages 'email:"ana@example.com" OR domain:example.com'
wa personal search messages 'mentions:"person:12"'
```

В таблице `<phone>` означает номер: на этих страницах настоящего номера нет. Заключите в кавычки значение, имеющее `+` или `@`, поскольку оба являются операторами. Телефон найден, как написано: с пробелами, тире и кодом страны или без них, это один телефон, а номер без `+` читается со странами настройки `phone_countries`. `domain:` обрабатывает `docs.example.com` как `example.com`. `mentions:` берет ссылку на человека, организацию или документ и находит сообщения, упоминания которых вы связали с ним с помощью `wa personal mentions confirm`.

## Пресеты [#пресеты]

Пресет находит текст по его форме. Используйте его, чтобы найти пароль, код или номер карты, который кто-то прислал.

| Предустановленные | Кандидат |
| --- | --- |
| `password` | метка пароля, за которой следует значение |
| `code` | этикетка с кодом подтверждения и 4–8 цифр |
| `api-key` | метка API-ключа и значение |
| `secret` | пароль, секрет, токен или метка ключа API и значение |
| `card` | 13–19 цифр с необязательными пробелами и дефисами |
| `bank` | значение в форме IBAN |
| `passport` | указанная стоимость паспорта или российская форма из 4+6 цифр |
| `phone` | международный телефонный номер с префиксом плюс |
| `email` | форма адреса электронной почты |
| `url` | ссылка HTTP(S) |
| `contact` | вложение с контактом, адрес электронной почты или телефон |
| `location` | вложение местоположения или гео: ссылка |

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

## Даты [#даты]

`--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"`.

## Слова, подстановочные знаки и регулярные выражения [#слова-подстановочные-знаки-и-регулярные-выражения]

Текст сворачивается перед индексацией и поиском: строчные буквы, без диакритических знаков. Побочный эффект: некоторые разные слова становятся одинаковыми, например `año` и `ano`. `text:` Регулярные выражения и подстановочные знаки сворачиваются таким же образом.

`text:/pay/` соответствует слову pay, а не платежу целиком. `body:/pay/` соответствует только сообщению, весь текст которого платный, с учетом регистра; чтобы найти его где угодно, используйте `body:/.*pay.*/`. Это синтаксис регулярных выражений Lucene, без обхода JavaScript, обратных ссылок, привязок и флагов.

В большом хранилище короткий префикс, такой как `a*`, может расширяться до более чем 10 000 слов и отклоняется; удлинить его. Длинные запросы, глубокая вложенность, большие шаблоны и медленное сканирование отклоняются с помощью `validation_error`, причина `query.too-large`, а не сокращаться: сузить чат, даты или шаблон.

## Ответ [#ответ]

`--json` возвращает `{ items, page: { limit, has_more }, next?, missing?, meta }`, даже если ничего не найдено. `--jsonl` передает только элементы.

* `items`: хиты, сначала лучшие (или сначала самые новые с `--newest`), каждый со своим `ref` (`msg:…`), `timestamp`,
  `sender_name`, `excerpt` и `matched_in`.
* `meta.accounts`: на каких аккаунтах производился поиск.
* `missing`: то, что ответ не видел, каждый со своим шагом, который его заполняет. `text` означает, что индекс слов все еще строится (шаги `store.migrate`, `wa personal store migrate`).
* `next`: шаги для запуска. `page.next` повторяет запрос для следующей страницы.
* `page.has_more` речь идет о странице, а не о том, держит ли телефон больше.

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

## Через MCP [#через-mcp]

Когда агент выполняет поиск на сервере MCP `wa`, `wa_read` (`command: "search messages"`) принимает запрос как `query`, а `timezone` — для календарной зоны. `chat` принимает идентификатор или сохраненное имя; `source`, `newest`, `context` и `limit` работают так же, как параметры команды; `saved` запускает сохраненный поиск. `thread`, `thread_hops`, `thread_messages`, `thread_bytes` и `thread_within` соответствуют опциям `--thread…`. Ответ имеет те же поля, что и `--json`. `wa_read` (`command: "stats messages show"`) считает одни и те же запросы. `wa personal mcp --no-record` или `record`, установленный на `false`, исключает вызовы сервера из истории запросов ([MCP](/llms.mdx/docs/ru/wa/mcp/content.md)).

## Далее [#далее]

* [Поиск](/llms.mdx/docs/ru/wa/search/content.md): ежедневные поиски, сохраненные поиски и подсчет.
* [Локальная база данных](/llms.mdx/docs/ru/wa/archive/content.md): что хранится в локальном хранилище и почему при поиске сообщение может не отображаться.
