Question

Je suis nouveau sur sphinx et je l’installe sur un nouveau site Web. Cela fonctionne bien et lorsque je recherche avec la recherche dans la console, tout fonctionne.

L’utilisation de l’API PHP et de la recherche me donne les mêmes résultats. Mais cela ne me donne que les identifiants et les poids pour les lignes trouvées. Existe-t-il un moyen de rapprocher certains champs de texte avec le hachage "match", par exemple?

S'il n'existe aucun moyen de le faire, quelqu'un a-t-il une bonne idée sur la façon de récupérer les enregistrements de la base de données (sql) dans l'ordre de tri du poids du sphinx (en les recherchant tous en même temps)?

Était-ce utile?

La solution

Vous pouvez utiliser un appel de fonction mysql FIELD () dans ORDER BY pour vous assurer que tout est dans l'ordre spécifié par sphinx.


$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)

Autres conseils

Oui, Sphinx n'apporte pas les résultats. Mais j’ai trouvé un moyen simple de réorganiser la requête à l’aide de la clause IN (), afin de tout réunir.

Quering quelque chose

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

indexe simplement le résultat, avec son identifiant dans la table:

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

et ayant les résultats correspondants de sphinx, il est très facile de réorganiser:

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

Cela fonctionnera si vos $ sphinxs_results sont dans le bon ordre.

sa réponse presque pat, mais avec moins d'une boucle. Je suppose que je peux faire une différence dans les grands résultats.

Malheureusement, sphinx n’a pas retourné les champs correspondants, mais uniquement ses identifiants (l’index sphinx ne contenait pas de données - uniquement du hachage à partir de données). Vous trouverez des informations sur ce problème sur le forum sphinxsearch.com.

Comme le dit Alex, Sphinx ne renvoie pas cette information. Vous devrez utiliser les identifiants pour interroger vous-même la base de données. Il vous suffit de parcourir chaque identifiant, d'extraire vos données pertinentes et de conserver les résultats dans l'ordre de pondération. Pour tout faire en une seule requête, vous pouvez essayer l'une des solutions suivantes (code psuedo - PHP n'est pas ma langue de choix):

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top