Как использовать Manticore Search в PHP‑приложении?

Всем привет. Не могу понять, что не так с Manticore — делаю всё по инструкции и запускаю через Docker, но результаты не те. Ниже приведены мои настройки Docker и конфигурация manticore.conf — подскажите, пожалуйста, в чём может быть проблема и что нужно поправить: <br/> <br/> Настройки докера: <br/> <pre><code>manticore:
  • 29 апреля 2026 г. 9:03
Ответы на вопрос 2
Короткий ответ — нужно убедиться, что:
- контейнер действительно запускает searchd с вашим конфигом (и вы монтируете конфиг в то место, где образ его ожидает),
- в конфиге listen указан слушающий адрес, который доступен из PHP‑контейнера (обычно 0.0.0.0:9306 или 9306:mysql41),
- вы используете правильный способ заполнения индекса (RT — можно писать напрямую, plain — нужно прогнать indexer),
- PHP подключается к правильному хосту/порту (имя сервиса докера или localhost + проброшенный порт).

Ниже — чеклист и рабочие примеры + команды для отладки. Если после этого не получится — пришлите сюда ваш docker-compose.yml (или docker run), содержимое manticore.conf и вывод docker logs manticore — помогу конкретнее.

1) Минимальная рабочая конфигурация (docker-compose)
- Пример docker-compose для быстрого старта (идейный; путь к конфигу уточните по документации образа или проверьте в контейнере):
  version: '3.8'
  services:
    manticore:
      image: manticoresearch/manticore:latest
      ports:
        - "9306:9306"   # MySQL‑совместимый протокол (обычно для PDO/mysql client)
        - "9312:9312"   # Sphinx API (если нужно)
      volumes:
        - ./manticore.conf:/etc/manticoresearch/manticore.conf:ro
        - ./data:/var/lib/manticore
      restart: unless-stopped

Важно: смонтированный файл manticore.conf должен попадать именно в тот путь, который использует образ. Если сомневаетесь, запустите контейнер без монтирования и посмотрите внутри, где лежит конфиг:
- docker run --rm -it manticoresearch/manticore:latest bash
- find / -name manticore.conf

2) Минимально‑корректный manticore.conf (пример)
searchd {
  # слушать MySQL‑протокол (для PDO/mysql), допускающий подключения извне
  listen = 0.0.0.0:9306:mysql41
  # (опционально) слушать SphinxAPI
  listen = 0.0.0.0:9312
  log = /var/log/manticore/searchd.log
  query_log = /var/log/manticore/query.log
  pid_file = /var/run/manticore/searchd.pid
  data_dir = /var/lib/manticore
}

# RT‑индекс — удобно для записи из PHP
index test_rt {
  type = rt
  rt_mem_limit = 128M
  # поля/атрибуты определяются при вставке/DDL в RT не нужны в конфиге
}

Если вы используете disk‑индексы (type=plain), их нужно определить и затем запускать indexer:
index mydisk {
  type = plain
  path = /var/lib/manticore/mydisk
  rt_mem_limit = 128M
  # other fields...
}

3) Как получать / записывать данные из PHP

- Самый простой путь — MySQL‑совместимый протокол через PDO:

<?php
$pdo = new PDO('mysql:host=manticore;port=9306;charset=utf8', '', '');
// Создать RT‑индекс (если ещё не создан) можно через SQL:
$pdo->exec("CREATE TABLE test_rt (id BIGINT, title TEXT, content TEXT, KEY title (title)) TYPE=rt");

// Вставка в RT
$stmt = $pdo->prepare("INSERT INTO test_rt (id, title, content) VALUES (?, ?, ?)");
$stmt->execute([1, 'Заголовок', 'Текст для индексирования']);

// Поиск
$q = 'поиск';
$stmt = $pdo->prepare("SELECT id, weight() AS w FROM test_rt WHERE MATCH(:q) LIMIT 10");
$stmt->execute([':q' => $q]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

- Можно также использовать официальную PHP‑библиотеку (composer): manticoresearch/manticoresearch-php — она предоставляет HTTP/REST интерфейс и некоторые удобства. Но PDO/mysql обычно проще и надежнее.

4) Частые ошибки и как их диагностировать
- Конфиг не монтируется туда, где его ожидает образ — проверьте путь конфигурации в образе.
- searchd слушает только на 127.0.0.1 — тогда PHP‑контейнер не сможет подключиться. В конфиге используйте 0.0.0.0:9306 или конкретное имя интерфейса.
- Порта нет в docker-compose (не проброшен) — тогда при обращении с хоста/другого контейнера доступ ограничен. Либо используйте внутреннюю сеть docker (php контейнер и manticore в одном compose — тогда проброс портов не нужен, используйте имя сервиса).
- Для disk‑индексов забыли запустить indexer. Проверьте: docker exec manticore indexer --all --config /path/to/manticore.conf; docker exec manticore searchd --help
- Права на data_dir/логи — searchd не стартует. Смотрите docker logs manticore и файлы /var/log/manticore/searchd.log внутри контейнера.
- Подключаетесь на неправильный порт/протокол. Для SQL‑подключения используйте порт 9306 (mysql41). Для старого SphinxAPI — 9312.

Диагностические команды (выполнить в хосте):
- docker ps  # увидеть контейнер
- docker logs manticore  # вывод логов
- docker exec -it manticore bash
  - ps aux | grep searchd
  - tail -n 200 /var/log/manticore/searchd.log
  - mysql -h127.0.0.1 -P9306 -e "SHOW TABLES;"
  - mysql -h127.0.0.1 -P9306 -e "SHOW STATUS;"

Из контейнера PHP:
- Попробуйте telnet manticore 9306 или попробуйте PDO с именем сервиса: host=manticore

5) Если результаты "не те"
- Убедитесь, что вы ищете в правильном индексе (SELECT ... FROM index_name WHERE MATCH(...)).
- Проверьте, что документы действительно проиндексированы (SELECT COUNT(*) FROM index_name).
- Для RT — убедитесь, что вставка прошла (SELECT COUNT(*) FROM test_rt) и что вы не подключены к другому экземпляру с пустыми данными.
- Убедитесь, что не используете кеш старых индексов (если изменяли конфиг и пути).

6) Что пришлите мне для точной диагностики
- docker-compose.yml (или команду docker run, которую вы используете),
- полный manticore.conf,
- вывод docker logs manticore после старта,
- вывод команды из контейнера: mysql -h127.0.0.1 -P9306 -e "SHOW TABLES; SELECT COUNT(*) FROM <ваш_индекс>;" (если индекс есть).

Если хотите, я сразу посмотрю ваши файлы и укажу, что поправить.
вот оно — на скрине файлы <code>news.new.spa</code> , <code>news.new.spd</code> и т.д. <code>--rotate</code> создаёт <code>.new</code> -файлы и сигналит запущенному searchd, чтобы тот подхватил. Но searchd в этот момент ещё не стартовал — файлы так <code>.new</code> и висят, а searchd при запуске ничего не видит. <br/> <br/> Убери <code>--rotate</code> : <br/> <code>indexer --all &amp;amp;&amp;amp; searchd --nodetach</code>
Похожие вопросы