Задать вопрос

Sphinx — как использовать строгий поиск с выражениями?

Здравствуйте. Есть Sphinx как модуль к PHP. Задача по сути простая, но никак не могу найти подходящее решение.
В MySQL есть таблица вида id | user_id | title. Sphinx индексирует это и осуществляется поиск по связке user_id + title.
Поле title может быть вида abc | abc:xyz т.е. либо просто строкой либо строкой с двоеточием.
Необходимо сделать suggest-происк, т.е. весь поиск вида query*.
Есть два варианта поиска:
1. Найти строку, которая начинается с текста запроса.
2. Найти строку, в которой текст запроса следует после двоеточия.

В данный момент поиск осуществляется так:

$sphinx = Service::sphinx(); // Здесь происходит подключение клиента к серверу
$sphinx->SetMatchMode( SPH_MATCH_EXTENDED ); // Устанавливается режим совпадения
$sphinx->setFilter('user_id', [$this->id]); // Устанавливается фильтр по user_id

// Собственно сам запрос
if ($part == 'second') {
    $results = $sphinx->query(':'.$text.'*', 'index');
} else {
    $results = $sphinx->query('^'.$text.'*', 'index');
}


В итоге это то работает но криво, то не работает вообще. И не удаётся найти ничего полезного по теме на просторах интернета.

Конфиг примерно такой:
source index
{
        type                    = mysql
        sql_host                = ...
        sql_user                = ...
        sql_pass                = ...
        sql_db                  = ...
        sql_port                = 3306

        sql_query_pre           = SET NAMES utf8

        sql_query               = \
                SELECT \
                        id, user_id, title \
                FROM \
                        table

        sql_field_string        = title
        sql_attr_uint           = user_id

        sql_query_pre           = SET NAMES utf8
        sql_query_pre           = SET SESSION query_cache_type=OFF

        sql_query_info          = SELECT * FROM table WHERE id=$id
}

index index
{
        source                  = index
        path                    = /var/lib/sphinxsearch/data/index
        docinfo                 = extern
        charset_type            = utf-8
        mlock                   = 0
        index_exact_words       = 1
        min_word_len            = 1
        enable_star             = 1
        prefix_fields           = title
        min_prefix_len          = 1
}


Буду очень благодарен за помощь и любую информацию. Спасибо!
  • Вопрос задан
  • 4118 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@whats
Решение одно, использовать SphinxQL
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы