Сфинкс PHP-поиск

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

Так, например, если я наберу «50», я получу:

  • 50 центов
  • 50 львов
  • 50-футовая волна и т. д.

Это здорово, но когда я ищу «50 Ce», я получаю:

  • Рычаце Двудзиестки
  • Списек
  • Бернхард Галь
  • Ковабунга Гоу-Гоу

И другие сумасшедшие результаты. Также, когда я ищу «50 Cent», правильный результат находится вверху, а случайные результаты внизу. Есть идеи, почему?

PHP-код:

$query = $_GET['query'];

if (!empty($query))
{
 $sphinx->SetMatchMode(SPH_MATCH_ALL);
 $sphinx->AddQuery($query, 'artists');
 $sphinx->AddQuery($query, 'variations');

 $sphinx->SetFilter('name', array(3));

 $sphinx->SetLimits(0, 10);

 $result = $sphinx->RunQueries();

 echo '<pre>';

 switch ($result)
 {
  case false:
   echo 'Query failed: ' . $sphinx->GetLastError() . "\n";
   break;
  default:
   if ($sphinx->GetLastWarning())
   {
    echo 'WARNING: ' . $sphinx->GetLastWarning() . "\n";
   }

   if (is_array($result[0]['matches']) && count($result[0]['matches']))
   {
    foreach ($result[0]['matches'] as $value => $info)
    {
     $artist = artistDetails($value);
     echo $artist['name'] . "\n";
    }
   }
 }
}

Индекс и источник сфинкса:

source artists
{
 type     = mysql

 sql_host    = localhost
 sql_user    = user
 sql_pass    = pass
 sql_db     = db
 sql_port    = 3300

 sql_query    = \
  SELECT \
    id, name \
  FROM artists;

 #UNIX_TIMESTAMP(time)
 #sql_attr_uint   = group_id
 #sql_attr_timestamp  = time

 sql_query_info   = SELECT id,name FROM artists WHERE id=$id
}

index artists
{
 source     = artists
 path     = /var/sphinx/artists
 docinfo     = extern
 charset_type   = utf-8
}

person James    schedule 19.03.2010    source источник


Ответы (1)


Вам нужно использовать параметр конфигурации индекса min_prefix_len, чтобы сообщить sphinx, что вы хотите, чтобы он индексировал и сопоставлял частичные слова. Возможно, вам также потребуется установить для enable_star значение 1.

http://www.sphinxsearch.com/docs/current.html#conf-min-prefix-len

index artists
{
 source     = artists
 path     = /var/sphinx/artists
 docinfo     = extern
 charset_type   = utf-8
 min_prefix_len   = 2
 enable_star   = 1
}

после включения индексации префикса вы сможете искать такие вещи, как «50 Ce *», чтобы получить частичные совпадения слов. Если вы хотите, чтобы были разрешены частичные совпадения слов, не требуя, чтобы ваши пользователи знали о добавлении самих *, вам, вероятно, придется изменить строку поиска программно, прежде чем передавать ее в sphinx.

person Ty W    schedule 19.03.2010
comment
Это фантастика. Я не уверен, верно ли это только для более новых версий Sphinx или нет, но вам может вообще не понадобиться устанавливать enable_star = 1. Я не изменил значения по умолчанию, и мои запросы работали точно так же. Кроме того, для большинства случаев использования (не для этого) я думаю, что min_prefix_len меньше 4 может быть ненужным. Если кто-то может прокомментировать производительность здесь, я был бы очень признателен. - person Josh Smith; 29.09.2010
comment
Не обращайте внимания на то, что я сказал о min_prefix_len. Что касается автозаполнения поиска, я считаю, что установка значения 2 творит чудеса. - person Josh Smith; 08.10.2010
comment
привет, я новичок в sphinx, использующем сервер linux. Но я получаю сообщение об ошибке №: 111. - person Karthik; 20.04.2011
comment
@KSReddy: код ошибки 111 для ошибки подключения. Проверьте порт, который вы предоставили Sphinx, может быть неправильным. Проверьте с ним. обычно вы используете Sphinx API, а затем используете 9312. Я тоже ломал голову около 3 часов, когда работал над этим. - person Nishant Shrivastava; 23.05.2011