Pregunta

Soy nuevo en la esfinge, y lo estoy configurando en un nuevo sitio web. Está funcionando bien, y cuando busco con buscar en la consola, todo funciona.

Usar la API de PHP y la búsqueda, también me da los mismos resultados. Pero solo me da identificadores y pesos para las filas encontradas. ¿Hay alguna manera de poner algunos campos de texto junto con el hash de 'coincidencias', por ejemplo?

Si no hay forma de hacer esto, ¿alguien tiene una buena idea sobre cómo recuperar los registros de la base de datos (sql) en el orden de clasificación de peso de la esfinge (buscando en todos ellos al mismo tiempo)?

¿Fue útil?

Solución

Puedes usar una función mysql FIELD () en tu ORDER BY para asegurarte de que todo esté en el orden especificado para la esfinge.


$idlist = array();
foreach ( $sphinx_result["matches"] as $id => $idinfo ) {
    $idlist[] = "$id";
}
$ids = implode(", ", $idlist);

SELECT * FROM table WHERE id IN ($ids) ORDER BY FIELD(id, $ids)

Otros consejos

Sí, la esfinge no trae los resultados. Pero descubrí una manera simple de reordenar la consulta usando la cláusula IN (), para reunir a todos.

Queriendo algo

SELECT * FROM table WHERE id IN(id_list... )

simplemente indexando el resultado, con su identificación en la tabla:

while ($row = mysql_fetch_objects)
   $result[$row->id] = $row; 

y teniendo los resultados coincidentes de sphinx, es muy fácil reordenar:

$ordered_result = array();
foreach ($sphinxs_results['matches'] as $id => $content)
   $ordered_result[] = $result1[$id];

esto funcionará si sus $ sphinxs_results están en el orden correcto.

es casi la respuesta de Pat, pero con menos un bucle. Supongo que puede hacer alguna diferencia en los grandes resultados.

desafortunadamente, la esfinge no devolvió campos coincidentes, solo sus identificadores (el índice de la esfinge no contenía datos, solo hash de los datos). Publica sobre este problema que puedes encontrar en el foro sphinxsearch.com.

Como dice Alex, Sphinx no devuelve esa información. Tendrá que usar las ID para consultar la base de datos usted mismo: solo haga un bucle a través de cada ID, saque sus datos relevantes y mantenga los resultados en orden de ponderación. Para hacerlo todo en una consulta, puede intentar algo como lo siguiente (psuedo-code - PHP no es mi idioma de elección):

results = db.query("SELECT * FROM table WHERE id IN (%s)", matches.join(", "));
ordered_results = [];

for (match in matches) {
  for (result in results) {
    if (result["id"] == match) {
      ordered_results << result;
    }
  }
}

return ordered_results;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top