2010-03-19 19 views
15

Estoy haciendo una búsqueda de Sphinx pero obteniendo resultados realmente extraños. Cualquier ayuda es apreciada.Sphinx PHP search

Así por ejemplo, si escribo "50", me sale:

  • 50 Cent
  • 50 leones
  • 50 Foot Wave, etc.

Esto es muy bueno, pero cuando busco "50 Ce", obtengo:

  • Ryczące Dwudziestki
  • Spisek
  • Bernhard Gal
  • Cowabunga Go-Go

y otros resultados locos. También cuando busco "50 Cent", el resultado correcto está en la parte superior, pero luego aparecen resultados aleatorios a continuación. ¿Alguna idea de por qué?

código 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"; 
    } 
    } 
} 
} 

Índice Esfinge y Fuente:

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 
} 

Respuesta

21

Es necesario utilizar la opción de índice config min_prefix_len para contar esfinge que desea para indexar y combinar con palabras incompletas. Es posible que también necesita establecer enable_star a 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 
} 

después de habilitar la indexación prefijo que será capaz de buscar cosas como "Ce * 50" para las búsquedas parciales de palabras. Si desea que se permitan coincidencias parciales de palabras sin requerir que sus usuarios sepan agregar * ellos mismos, probablemente tendrá que modificar la cadena de búsqueda programáticamente antes de pasarla a sphinx.

+0

Las palabras no pueden describir mi agradecimiento :) – James

+1

Esto es fantástico. No estoy seguro de si esto solo es cierto para las versiones más nuevas de Sphinx o no, pero es posible que no necesites configurar 'enable_star = 1'. No modifiqué el valor predeterminado y mis consultas funcionaron igual. Además, para la mayoría de los casos de uso (no este) creo que tener un 'min_prefix_len' menor que 4 puede ser innecesario. Si alguien puede comentar sobre el rendimiento aquí, estaría muy agradecido. –

+0

Ignora lo que dije sobre 'min_prefix_len'. Para el autocompletado de búsqueda, estoy descubriendo que hace maravillas tenerlo configurado en 2. –