Domanda

Sono nuovo di sfinge e lo sto configurando su un nuovo sito web. Funziona bene e quando cerco con la ricerca nella console, tutto funziona.

L'uso dell'API PHP e della ricerca mi dà gli stessi risultati. Ma mi dà solo ID e pesi per le righe trovate. Esiste un modo per avvicinare alcuni campi di testo all'hash "match", ad esempio?

Se non c'è modo di farlo, qualcuno ha una buona idea su come recuperare i record dal database (sql) nell'ordinamento del peso della sfinge (cercandoli contemporaneamente)? ??

È stato utile?

Soluzione

Puoi usare una funzione mysql FIELD () nella tua ORDER BY per assicurarti che tutto sia nell'ordine specificato sfinge.


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

Altri suggerimenti

Sì, la sfinge non porta i risultati. Ma ho scoperto un modo semplice per riordinare la query utilizzando la clausola IN (), per riunire tutti.

Richiesta di qualcosa

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

semplicemente indicizzando il risultato, con il loro ID nella tabella:

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

e avendo i risultati corrispondenti della sfinge, è molto facile riordinare:

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

questo funzionerà, se $ sphinxs_results sono nell'ordine corretto.

è quasi la risposta di Pat, ma con meno un loop. Posso fare una certa differenza nei grandi risultati, immagino.

sfinge sfortunatamente non restituisce campi corrispondenti, solo i suoi ID (l'indice sfinge non contiene dati - solo hash dai dati). Pubblica su questo problema che puoi trovare sul forum sphinxsearch.com.

Come dice Alex, Sphinx non restituisce tali informazioni. Dovrai utilizzare gli ID per eseguire una query sul database da solo: basta scorrere ogni ID, ottenere i dati rilevanti, mantenendo i risultati in ordine di ponderazione. Per fare tutto in una sola query, puoi provare qualcosa di simile al seguente (psuedo-code - PHP non è la mia lingua preferita):

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top