OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

Dovecot FTS Xapian: быстрый IMAP‑поиск без внешних сервисов

Полноценный гид для админа: что даёт FTS в Dovecot, как выбрать Xapian вместо Solr, как установить, включить автоиндексацию, ускорить IMAP SEARCH, индексировать вложения и безопасно обслуживать десятки гигабайт писем.
Dovecot FTS Xapian: быстрый IMAP‑поиск без внешних сервисов

Если ваши пользователи жалуются, что поиск по почте в IMAP «думает» по полминуты и чаще всего идёт по телам писем целиком, значит пришло время полнотекстового поиска (FTS). В экосистеме Dovecot есть несколько вариантов, и самый практичный из «самостоятельных» — плагин FTS Xapian. Он не требует внешних Java‑сервисов, почти не усложняет инфраструктуру и даёт быстрый отклик на IMAP SEARCH даже в многогигабайтных ящиках.

Что такое FTS в Dovecot и чем Xapian хорош

IMAP‑клиенты (Thunderbird, Outlook, мобильные) отправляют команды SEARCH/UID SEARCH на сервер. Без индекса сервер вынужден построчно читать письма, что дорого по диску и CPU. Модуль FTS создаёт отдельный индекс токенов (слов, нормализованных форм, n‑грамм), чтобы быстро отвечать на запросы по телу письма и, по желанию, по вложениям. Dovecot поддерживает несколько бэкендов FTS: встроенные (Lucene, Solr) и плагин на базе Xapian. Последний привлекателен тем, что:

  • не требует JVM и отдельного кластера — индексы локальные рядом с почтой;
  • быстро строит индекс на обычных CPU и SSD, эффективно работает с большими ящиками;
  • прост в установке и обновлении, хорошо вписывается в типичную схему Dovecot + Postfix;
  • поддерживает частичный поиск (по частям слов) через настройку n‑грамм.

Идея проста: CPU тратим один раз на построение индекса, а потом экономим на каждом поисковом запросе. Для больших ящиков выгода драматическая: запросы «тело содержит…» выполняются в считанные миллисекунды.

Архитектура: где живут индексы и как происходит поиск

При включении FTS в Dovecot задействуются службы indexer и indexer-worker, а также FTS‑плагин. Индексы обычно хранятся в каталоге пользователя рядом с dovecot.index и dovecot.cache; Xapian создаёт собственные файлы базы. Процесс такой:

  1. Когда новое письмо поступает в ящик (LMTP/Local delivery), Dovecot по возможности запускает автоиндексацию;
  2. Планировщик индексатора строит токены, применяет стемминг/нормализацию и записывает их в Xapian‑базу;
  3. Когда клиент делает SEARCH, Dovecot перенаправляет запрос в FTS, получает список UID, а затем быстро возвращает результаты.

Если автоиндексация выключена, или индекс частично отсутствует, Dovecot может достроить его на лету или вернуться к медленному сканированию. Чтобы этого не происходило в продакшене, обычно включают fts_enforced.

Планирование ресурсов: CPU, RAM, диск

Оценки из практики:

  • Диск: индексы Xapian обычно занимают 5–20% от объёма писем, в зависимости от языка, плотности текста, количества вложений, параметров n‑грамм и стемминга.
  • CPU: первичное построение на SSD — несколько десятков тысяч писем в минуту на 2–4 ядрах; на HDD — в разы медленнее.
  • ОЗУ: индексатор держит буферы; разумно ограничить память воркеров через vsz_limit и регулировать параллелизм process_limit.

Для серверов с активными ящиками (десятки пользователей, десятки гигабайт) комфортная отправная точка: 2–4 vCPU, 4–8 ГБ RAM, быстрый SSD. На медленных дисках автоиндексация может заметно мешать доставке — снижайте параллелизм. Разворачивать почту удобнее на облачном VDS, где можно гибко изменить CPU/ОЗУ под нагрузку индексатора.

Схема: процессы indexer и indexer-worker, почтовые ящики и файлы индекса Xapian

Подготовка: пакеты и компоненты

Нужны установленные Dovecot IMAP и компоненты индексатора. Для большинства современных дистрибутивов доступны пакеты Dovecot и Xapian. Плагин FTS Xapian поставляется в виде отдельного пакета или собирается из исходников (стандартные инструменты сборки, библиотеки Xapian). Также пригодятся утилиты для извлечения текста из вложений, если вы хотите индексировать PDF/Office.

Примеры установки пакетов

# Debian/Ubuntu
sudo apt update
sudo apt install dovecot-imapd dovecot-core dovecot-lmtpd dovecot-sieve xapian-tools
# Если доступен пакет плагина (название зависит от дистрибутива)
sudo apt install dovecot-fts-xapian

# RHEL/AlmaLinux/Rocky
sudo dnf install dovecot dovecot-pigeonhole xapian-core xapian-core-libs
# Если доступен пакет плагина
sudo dnf install dovecot-fts-xapian

# Утилиты для декодирования вложений (примерный набор)
sudo apt install poppler-utils catdoc docx2txt odt2txt unzip p7zip-full
# или
sudo dnf install poppler-utils catdoc docx2txt odt2txt unzip p7zip

Если в вашем репозитории нет готового плагина, его можно собрать из исходников, установив инструменты разработки и библиотеки Xapian. Детали зависят от дистрибутива; важны соответствие версии Dovecot и пути установки модулей плагина.

Виртуальный хостинг FastFox
Виртуальный хостинг для сайтов
Универсальное решение для создания и размещения сайтов любой сложности в Интернете от 95₽ / мес

Базовая конфигурация Dovecot FTS Xapian

Ниже — минимально рабочая конфигурация. Проверьте, что mail_plugins включает fts и fts_xapian, а службы индексатора активированы.

# /etc/dovecot/conf.d/10-mail.conf (фрагмент)
mail_plugins = $mail_plugins fts fts_xapian

# /etc/dovecot/conf.d/90-plugin.conf
plugin {
  # Использовать Xapian как бэкенд FTS
  fts = xapian

  # Автоиндексация новых писем и изменений
  fts_autoindex = yes

  # Жёстко требовать наличие FTS для SEARCH (иначе будет fallback к медленному сканированию)
  fts_enforced = yes

  # Таймаут построения индекса для одного письма/батча (регулируйте под IO)
  fts_index_timeout = 120 s

  # Индексация вложений через декодер (опционально)
  fts_decoder = decode2text

  # Параметры Xapian: пример для частичного поиска с n‑граммами
  # Значения — ориентировочные, подбирайте на своих данных
  fts_xapian = partial=3 full=20

  # Можно исключить некоторые системные папки из автоиндексации
  fts_autoindex_exclude = Trash
  fts_autoindex_exclude2 = Junk
}

# /etc/dovecot/conf.d/10-master.conf (фрагмент)
service indexer {
  # Обычно достаточно значений по умолчанию
}

service indexer-worker {
  # Ограничить параллелизм и память индексаторов
  process_limit = 2
  vsz_limit = 512 M
}

Перезапустите Dovecot после изменений:

sudo systemctl reload dovecot
# при первой установке надёжнее
sudo systemctl restart dovecot

Первичное построение индекса

Автоиндексация покроет новые письма, но для уже существующих ящиков имеет смысл пройтись прогоном doveadm index. Делайте это вне пикового времени и ограничивайте параллелизм.

# Индексация всех пользователей (осторожно на больших инсталляциях)
sudo doveadm index -A -q "*"

# Индексация конкретного пользователя и конкретного ящика
sudo doveadm index -u user@example.org -q INBOX

# Проверка поиска (по телу письма и теме)
sudo doveadm search -u user@example.org mailbox INBOX text "отчет"
sudo doveadm search -u user@example.org mailbox INBOX subject "invoice"

Если видите «no matches» там, где ожидаете результаты — включите детальный лог и проверьте, что письма попадают в индексатор. Полезно временно включить mail_debug=yes и log_path/info_log_path.

Индексация вложений: когда нужна и как включать

Большая часть корпоративной переписки — это вложения. Индексация контента PDF/Office даёт ощутимый выигрыш в поиске. Включив fts_decoder = decode2text, установите необходимые утилиты: для PDF — pdftotext (в пакете poppler-utils), для DOC/DOCX — catdoc/docx2txt, для ODT — odt2txt, а также unzip/p7zip для распаковки контейнеров.

Следите за диском: индексация больших вложений может заметно увеличить размер индекса. Если пользователи активно обмениваются PDF по 20–30 МБ, имеет смысл ограничить индексацию очень больших файлов и/или исключить мусорные папки из автоиндексации.

Семантика запросов IMAP SEARCH с FTS

FTS прозрачно интегрируется — клиенты продолжают отдавать IMAP SEARCH, но ответы приходят из индекса. Несколько практических примеров:

  • text "отчет" — ищет слово/форму в теле и, в зависимости от клиента, в заголовках;
  • subject "invoice" — быстрое совпадение по теме;
  • from "user@company" — обычно и без FTS быстро, но FTS не мешает;
  • частичный поиск зависит от partial в fts_xapian — чем меньше n‑грамма, тем больше совпадений и индекс.

Помните, что разные клиенты формируют запросы по‑разному: кто‑то отправляет сложные цепочки с OR/AND и кавычками, кто‑то — последовательные запросы «постепенного уточнения». Тестируйте с реальными клиентами пользователей.

Терминал Linux с примерами команд doveadm index и doveadm search

Тюнинг производительности

Параметры Xapian

Ключ к балансировке скорости/точности/объёма — параметры fts_xapian:

  • partial=N — размер n‑граммы для частичного поиска. 2–3 подходит для славянских языков, 3–4 — компромисс между объёмом и качеством.
  • full=M — длина слова, после которой применяется «полный» токен (без разбиения). Уменьшает объём индекса для длинных слов.

На практике начинать хорошо с partial=3 full=20, а затем тестировать качество поиска на ваших корпусах писем. Если пользователям часто нужен поиск «по фрагменту слова», partial=2 даст больше совпадений ценой роста индекса.

Индексатор и воркеры

Ограничьте параллелизм индексаторов согласно IO‑профилю:

service indexer-worker {
  process_limit = 2
  vsz_limit = 512 M
}

На VPS с быстрым NVMe и 4 vCPU можно поднять process_limit до 3–4, если индексация не мешает активной доставке. На HDD лучше оставить 1–2, чтобы избежать очередей в I/O планировщике.

Исключения и папки

Имеет смысл исключить Trash и Junk из автоиндексации, чтобы не тратить ресурс на мусор. С другой стороны, если пользователи активно ищут по Archive, лучше индексацию оставить.

Эксплуатация и обслуживание

Проверки и диагностика

# Сканирование структуры индекса FTS (обновит метки несоответствий)
sudo doveadm fts rescan -A

# Переиндексация проблемного ящика
sudo doveadm index -u user@example.org -q "*"

# Поиск для быстрой проверки (UID выдаёт список сообщений)
sudo doveadm search -u user@example.org mailbox INBOX text "договора"

Для диагностики увеличьте подробность логов. Полезно задать отдельные файлы log_path и info_log_path, включить mail_debug=yes на время расследования. Ошибки вида «plugin not found» указывают на отсутствие/несовместимость модуля FTS Xapian, ошибки прав — на неправильные владельцы каталога индексов. Дополнительно защитите сервисы от брутфорса — см. гайд Fail2ban для Postfix и Dovecot.

Обновления и совместимость

Держите версии Dovecot и плагина в соответствии. После обновления мажорных версий имеет смысл прогнать doveadm fts rescan и выборочную переиндексацию активных ящиков. Если переходите с другого бэкенда (Lucene/Solr), индексы несовместимы — их надо строить заново, при этом письма останутся нетронутыми. При миграциях почты без простоя пригодится наш разбор imapsync с нулевым простоем.

Бэкапы и восстановление

FTS‑индексы можно не включать в резервную копию: их легко перестроить. Это снижает объём бэкапа и ускоряет восстановление. Исключайте каталоги индексов Xapian из задач резервного копирования или помечайте как временные. В случае повреждения индекса удалите его каталог и выполните doveadm index.

Чек‑лист внедрения на продакшене

  • Оценить объёмы почты и дисковую квоту; предусмотреть +20% на индексы;
  • Проверить наличие пакета плагина FTS Xapian в репозитории или план сборки;
  • Включить fts = xapian, fts_autoindex = yes, настроить исключения;
  • Ограничить воркеры: process_limit, vsz_limit;
  • Включить декодер вложений и установить утилиты конвертации (по потребности);
  • Прогнать первичную индексацию в непиковое окно;
  • Проверить IMAP‑поиск с типовыми клиентами пользователей;
  • Настроить мониторинг логов и периодическую проверку doveadm fts rescan.

Типичные проблемы и решения

Поиск возвращает 0 результатов

Проверьте, что плагин загружен (mail_plugins содержит fts fts_xapian), что построен индекс (doveadm index) и что fts_enforced не мешает, когда индекса ещё нет. В логах не должно быть «Unknown setting: fts_xapian» — это признак отсутствия/не той версии плагина.

Вырастает нагрузка на диск и CPU

Снизьте process_limit у indexer-worker, исключите мусорные папки из автоиндексации, временно отключите индексацию вложений или ограничьте максимальный размер для декодера. Первичную индексацию лучше делать по ночам и батчами по пользователям.

Индекс повреждён

Такое случается при аварийных перезагрузках. Удалите каталог индекса Xapian для проблемного ящика (не письма!), затем выполните doveadm index. На время восстановления можно снять fts_enforced, чтобы пользователи могли делать поиск со сниженной скоростью.

Слишком много «ложных» совпадений на частичном поиске

Увеличьте partial (например, с 2 до 3), чтобы сократить количество пересечений n‑грамм, или обучите пользователей кавычкам и более точным запросам. Компромисс между полнотой и точностью всегда зависит от реальных данных.

Практические рекомендации по эксплуатации

  • Отключайте автоиндексацию для ящиков‑архивов, которые редко ищут, чтобы не тратить ресурсы на массовую доставку/импорт;
  • Если у пользователей много PDF‑отсканов, имеет смысл включить OCR на стороне MTA/архиватора и индексировать уже распознанный текст;
  • Храните индексы на том же быстром хранилище, что и почта. Разнос на медленный диск ухудшит общую отзывчивость;
  • Периодически запускайте doveadm fts rescan в кроне, чтобы поймать несоответствия после больших миграций/импорта;
  • В больших развёртываниях тестируйте параметры на копии реальных ящиков и фиксируйте метрики: среднее время SEARCH, рост индекса, IOPS.

Пример полной конфигурации (с комментариями)

# /etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins fts fts_xapian
mail_attachment_detection_options = add-flags-on-save

# /etc/dovecot/conf.d/90-plugin.conf
plugin {
  fts = xapian
  fts_autoindex = yes
  fts_enforced = yes
  fts_index_timeout = 120 s
  fts_decoder = decode2text

  # Балансируем качество частичного поиска и размер индекса
  fts_xapian = partial=3 full=20

  # Не тратим ресурсы на корзину и спам
  fts_autoindex_exclude = Trash
  fts_autoindex_exclude2 = Junk
}

# /etc/dovecot/conf.d/10-master.conf
service indexer {
  # настройки по умолчанию обычно подходят
}

service indexer-worker {
  process_limit = 3
  vsz_limit = 512 M
}

# /etc/dovecot/conf.d/10-logging.conf (по желанию)
# mail_debug = yes
# log_path = /var/log/dovecot.log
# info_log_path = /var/log/dovecot-info.log

Резюме

FTS Xapian для Dovecot — это практичный способ сделать IMAP‑поиск быстрым без внешних сервисов и сложной инфраструктуры. Он хорошо масштабируется на современных SSD, прост в настройке и обслуживании. Начните с базовой конфигурации, включите автоиндексацию, аккуратно настройте параметры fts_xapian под свои корпуса писем и держите под контролем параллелизм индексаторов. После первичной индексации пользователи сразу почувствуют разницу: мгновенный поиск в больших ящиках — это именно то, чего ждут от корпоративной почты.

Поделиться статьей

Вам будет интересно

Apache mod_cache: CacheQuickHandler, cache_disk vs cache_socache OpenAI Статья написана AI (GPT 5)

Apache mod_cache: CacheQuickHandler, cache_disk vs cache_socache

Если Apache — фронтенд или бэкенд для PHP/FCGI/прокси, mod_cache заметно разгружает приложение. Разбираем CacheQuickHandler, выбор ...
Docker BuildKit registry cache в CI: быстрые сборки на любом раннере OpenAI Статья написана AI (GPT 5)

Docker BuildKit registry cache в CI: быстрые сборки на любом раннере

Долгие Docker‑сборки в CI — классическая боль: свежие раннеры, мало диска и кэш каждый раз с нуля. Registry‑backed cache в BuildKi ...
MySQL 8: caching_sha2_password и TLS — безопасная аутентификация без сюрпризов OpenAI Статья написана AI (GPT 5)

MySQL 8: caching_sha2_password и TLS — безопасная аутентификация без сюрпризов

В MySQL 8 по умолчанию используется caching_sha2_password. Это повысило безопасность, но ломает старые клиенты без TLS. В статье — ...