Поиск PHP в Sphinx
Я провожу поиск по Сфинксу, но получаю действительно странные результаты. Любая помощь будет оценена по достоинству.
Так, например, если я наберу "50", я получу:
- 50 центов
- 50 львов
- 50-футовая волна и т.д.
Это здорово, но когда я ищу "50 Ce", я получаю:
- Рыченце Двудзестки
- Списек
- Бернхард Галь
- Ковабунга Гоу-Гоу
И другие сумасшедшие результаты. Также, когда я ищу "50 центов", правильный результат находится на вверху, но затем случайные результаты ниже. Есть идеи, почему?
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
}
1 answers
Вам нужно использовать параметр конфигурации индекса 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.