Sphinx возвращает пустые результаты

У меня есть проект с поисковой системой Sphinx.

Проблема в том, что для прямого поиска (когда пользователь вводит свой запрос и нажимает клавишу ввода) он работает отлично, но когда я пытаюсь реализовать автозаполнение, он возвращает нулевые результаты.

Версия Sphinx - 2.0.8 (по каким-то причинам не могу обновить).

Я использую этот код для автоконкурса (взят из здесь)

<?php
$ln_sph = new PDO("mysql:host=127.0.0.1;port = {$confs['port2']}",
            '',
            '',
            array
            (
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"  
            )
        );

$stmt = $ln_sph->prepare("SELECT * FROM ".implode(",", $used_indexes)." WHERE MATCH(':match') LIMIT 0,10 OPTION ranker=sph04");

$aq = explode(' ', $query);
if (mb_strlen($aq[count($aq) - 1]) < 3)
{
    $query = $query;
}
else
{
    $query = $query.'*';
}

$stmt->bindValue(':match', $query, PDO::PARAM_STR);         
$stmt->execute();
$products_ids = array();
foreach($stmt->fetchAll() as $data)
{
    //Reading data from sphinx              
}

Если я подключаюсь к Sphinx напрямую с сервера через mysql

mysql -P10006 --protocol=tcp

и выполнить тот же запрос, например:

SELECT * FROM `app_catalog_prod_suggests` WHERE MATCH('пирс*') LIMIT 0, 10 OPTION ranker=sph04;

он тоже отлично работает.

Индекс из sphinx.conf

index app_catalog_prod_suggests {
    source=app_catalog_prod_suggests
    path=/path/to/index
    enable_star=1
    min_word_len=3
    min_prefix_len=3
    morphology=stem_ru,stem_en,soundex
    charset_type=utf-8
    html_strip=1
}

Что я делаю неправильно?

P.S. При необходимости могу предоставить дополнительные данные

UPD. раздел searchd

searchd {
        listen=127.0.0.1:10005
        listen=127.0.0.1:10006:mysql41
        log=/path/to/log
        query_log=/path/to/querylog
        binlog_path = #
        pid_file=/path/to/pid
}

Показать раздел searchd из конфигурации и значение $ confs ['port2']. Вы видите какое-либо предупреждение или ошибку при запуске скрипта?

Manticore Search 22.05.2018 07:07

Обновлен вопрос @ Manticore-Sphinx Nextgen. Порт такой же, как в примере с mysql. Никаких ошибок и предупреждений

Rulisp 22.05.2018 07:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
440
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

После нескольких попыток я нашел причину такого поведения. Это было не в Sphinx, а в PDO.

Во-первых, я проверил, работает ли запрос вообще, например с некоторым постоянным значением - пирс*. И я был очень удивлен, что Сфинкс вернул мне именно то, что мне нужно.

Итак, проблема не в Сфинксе. Но где тогда? Была только одна линия, которая могла это вызвать - $stmt->bindValue(':match', $query, PDO::PARAM_STR);.

Я заменил bindValue на bindParam, и он начал работать с любым запросом.

Я не знаю настоящей причины такого поведения, и было бы здорово, если бы кто-нибудь мог это объяснить.

UPD

После дополнительных тестов ошибка была не в bindParam или bindValue, а в названии параметра.

Я думал, тебе нужно использовать этот код

$indexes = 'simplecomplete';
$query = trim($_GET['term']);

$stmt = $ln_sph->prepare("SELECT * FROM $indexes WHERE MATCH(:match)  LIMIT $start,$offset OPTION ranker=sph04,field_weights=(title=100,content=1)");
$stmt->bindValue(':match', $query,PDO::PARAM_STR);
    $stmt->execute();
$rows = $stmt->fetchAll();
   $meta = $ln_sph->query("SHOW META")->fetchAll();
foreach($meta as $m) {
    $meta_map[$m['Variable_name']] = $m['Value'];
}

соединение с базой данных

define ( "FREQ_THRESHOLD", 40 );
define ( "SUGGEST_DEBUG", 0);
define ( "LENGTH_THRESHOLD", 2 );
define ( "LEVENSHTEIN_THRESHOLD", 2 );
define ( "TOP_COUNT", 1 );
define ("SPHINX_20",false);
//database PDO
$ln = new PDO( 'mysql:host=127.0.0.1;dbname=test_database;charset=utf8', 'root', '' );

//Sphinx PDO
$ln_sph = new PDO( 'mysql:host=127.0.0.1;port=9306' );

Как я писал в своем ответе, проблема заключалась в имени параметра

Rulisp 22.05.2018 08:48

Другие вопросы по теме