Короткий ответ — нужно убедиться, что:
- контейнер действительно запускает 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 <ваш_индекс>;" (если индекс есть).
Если хотите, я сразу посмотрю ваши файлы и укажу, что поправить.