no such built-in procedure AUTOCOMPLETE

Сервер с manticore поднят в докере. Если подключиться таким образом:
docker compose exec manticore mysql -h0 -P9306
В консоли всё работает:

Подключаемся из symfony с помощью manticoresearch-php.
Параметры подключения:

$this->client = new Client([
            'host' => 'manticore',
            'port' => 9308,
            'transport' => 'Http',
        ], $logger);

Далее пытаюсь выполнить код:

$query = "CALL AUTOCOMPLETE('нач', 'otechnik_books_for_guest_distributed')";
$rawMode = true;
$response = $this->client->sql($query, $rawMode);

Получаю ошибку “no such built-in procedure AUTOCOMPLETE”

может быть просто mode?

$mode = true;

тк в этой функции manticoresearch-php/src/Manticoresearch/Client.php at master · manticoresoftware/manticoresearch-php · GitHub проверяется просто if (isset($params['mode'])) {

В указанном участке кода проверяется наличие параметра ‘mode’ и если он есть, его значение передаётся в метод $endpoint->setMode().

При этом чуть выше этот параметр заполняется нужным значением, если при вызове sql() второй параметр установлен в true (хотя, похоже, там и false так же сработает, что странно).

У меня при вызове метода sql() этот параметр есть.

$rawMode = true;
$response = $this->client->sql($query, $rawMode);

Написал вопрос разработчикам manticoresearch-php. Возможно, это на их стороне неправильно работает. Посмотрим, что ответят. Когда найду решение, отпишусь здесь.

Из monolog достал несколько строк:

[2025-08-08T15:36:29.074056+03:00] app.DEBUG: Request body: {"connection":{"transport":"Http","host":"manticore","scheme":"http","path":"","port":9308,"timeout":300,"connect_timeout":0,"proxy":null,"username":null,"password":null,"headers":[],"curl":[],"persistent":true},"payload":"mode=raw&query=CALL+AUTOCOMPLETE%28%27%D0%BD%D0%B0%D1%87%27%2C+%27otechnik_books_for_guest_distributed%27%29%3B"} []
[2025-08-08T15:36:29.074194+03:00] app.INFO: Request: {"url":"http://manticore:9308/sql","status":500,"time":0.0023939609527587891} []
[2025-08-08T15:36:29.074255+03:00] app.DEBUG: Response body: [{"error":"no such built-in procedure AUTOCOMPLETE"}] []
[2025-08-08T15:36:29.074334+03:00] app.ERROR: Response: {"url":"http://manticore:9308/sql","error":"\"no such built-in procedure AUTOCOMPLETE\"","payload":"mode=raw&query=CALL+AUTOCOMPLETE%28%27%D0%BD%D0%B0%D1%87%27%2C+%27otechnik_books_for_guest_distributed%27%29%3B"} []

Эти логи генерируются вот в этом файле.
Отформатированное содержимое строки запроса:

{
    "connection": {
        "transport": "Http",
        "host": "manticore",
        "scheme": "http",
        "path": "",
        "port": 9308,
        "timeout": 300,
        "connect_timeout": 0,
        "proxy": null,
        "username": null,
        "password": null,
        "headers": [],
        "curl": [],
        "persistent": true
    },
    "payload": "mode=raw&query=CALL+AUTOCOMPLETE%28%27%D0%BD%D0%B0%D1%87%27%2C+%27otechnik_books_for_guest_distributed%27%29%3B"
}

Вроде запрос выглядит правильно. mode=raw на месте.

Поэкспериментировал ещё немного. Если попробовать запустить запрос из логов с помощью curl, то получаю аналогичную ошибку:

curl "http://localhost:9308/sql?mo
de=raw&query=CALL+AUTOCOMPLETE%28%27%D0%BD%D0%B0%D1%87%27%2C+%27otechnik_books_for_guest_distributed%27%29%3B"
{"error":"no such built-in procedure AUTOCOMPLETE"}

Меня смутило, что пробелы в запросе заменены знаком “+”. Я заменил их на “%20”. И тогда запрос работает правильно.

curl "http://localhost:9308/sql?mode=raw&query=CALL%20AUTOCOMPLETE%28%27%D0%BD%D0%B0%
D1%87%27%2C%20%27otechnik_books_for_guest_distributed%27%29%3B"
[{"total":16,"error":"","warning":"","columns":[{"query":{"type":"string"}}],"data":[{"query":"над"},{"query":"святой"},{"query":"надо"},{"query":"свой"},{"query":"надобно"},{"query":"другой"},{"query":"надолго"},{"query":"той"},{"query":"надписи"},{"query":"какой"},{"query":"надписью"},{"query":"полной"},{"query":"надпись"},{"query":"живой"},{"query":"надолзе"},{"query":"хлад"}]}]

Выходит, надо разбираться, почему бандл manticoresearch-php заменяет в запросе пробелы на плюс и как изменить это поведение. На гитхабе разработчики бандла на мой вопрос пока не отреагировали.

Штош, удалось таки решить проблему )
Оказалось, что в manticoresearch-php есть метод autocomplete, который умеет делать правильный запрос к поисковому движку. Проблема, правда, в том, что в документации он не упоминается. Нужно самому его раскапывать в исходниках и так же выяснять в каком виде он принимает параметры. Итак, вызов метода выглядит примерно так:

$params = [
    'body' => [
        'table' => $table,
        'query' => $query,
        'options' => [
            'fuzziness' => 2,
            'preserve' => 0,
            'layouts' => 'ru,us',
            'append' => 1
        ]
    ]
];

$response = $this->client->autocomplete($params);

Ну и ответ приходит примерно в таком виде:

[
    {
        "total": 3,
        "error": "",
        "warning": "",
        "columns": [
            {
                "query": {
                    "type": "string"
                }
            }
        ],
        "data": [
            {
                "query": "названия"
            },
            {
                "query": "названиях"
            },
            {
                "query": "названиями"
            }
        ]
    }
]

Проблема решилась. Всем спасибо за внимание )

лучше было если вы откроете тикет в manticoresearch-php с описанием проблемы и как вы ее решили или даже открыли бы PR с обновлением документации

на самом деле есть документация по autocomplete manticoresearch-php/docs/usage.md at master · manticoresoftware/manticoresearch-php · GitHub

1 Like

Спасибо! Действительно, вы правы. К сожалению, сейчас уже не вспомню, как я искал, что не заметил этого.
Странно, что там ссылка на Autocomplete manual на самом деле ведёт на главную раздела Manual, а не на нужную страницу. Возможно, действительно сделаю PR.

Завёл PR docs: fixed a wrong to the autocomplete docs by sanikolaev · Pull Request #251 · manticoresoftware/manticoresearch-php · GitHub