2009-03-05 1 views
4

Ich bin neu bei Sphinx, und ich stelle es auf einer neuen Website. Es funktioniert gut, und wenn ich mit der Suche in der Konsole suche, funktioniert alles.Was ist der beste Weg, Informationen von Sphinx (in PHP) abzurufen?

Mit der PHP API und der Suche, gibt mir die gleichen Ergebnisse. Aber es gibt mir nur IDs und Gewichte für die gefundenen Zeilen. Gibt es eine Möglichkeit, einige Textfelder zum Beispiel mit dem Match-Hash zu verknüpfen?

Wenn es keine Möglichkeit gibt, dies zu tun, hat jemand eine gute Idee, wie Sie die Datensätze aus der Datenbank (sql) in der Sphinx Gewicht Sortierreihenfolge abrufen (alle gleichzeitig suchen)?

Antwort

1

Sie können einen mysql FIELD() - Funktionsaufruf in ORDER BY verwenden, um sicherzustellen, dass alles in der angegebenen Reihenfolge sphinx ist.


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

Dies kann extrem langsam sein, wenn die IN() - Liste sehr groß ist, da MySQL dies normalerweise in einen Bereichsscan umwandelt. Ich empfehle, eine temporäre Tabelle zu erstellen und sich ihr anzuschließen. – Will

0

Leider Sphinx nicht übereinstimmende Felder zurückgegeben, nur seine IDs (Sphinx-Index enthielt keine Daten - nur Hash aus Daten). Beitrag über dieses Problem können Sie auf dem sphinxsearch.com-Forum finden.

0

Wie Alex sagt, gibt Sphinx diese Information nicht zurück. Sie müssen die IDs verwenden, um die Datenbank selbst abzufragen - durchlaufen Sie einfach jede ID, holen Sie Ihre relevanten Daten heraus und behalten Sie die Ergebnisse in der Reihenfolge der Gewichtung bei. Um sie alle in einer Abfrage zu tun, können Sie so etwas wie die folgenden versuchen könnten (psuedo-Code - PHP ist nicht meine Sprache der Wahl):

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; 
4

Ja, Sphinx nicht die Ergebnisse bringen. Aber ich fand einen einfachen Weg, um die Abfrage mit der IN() -Klausel neu zu ordnen, um alle zusammen zu bringen.

Quering etwas

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

nur Indizierung das Ergebnis mit ihrer ID in der Tabelle:

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

und mit den passenden Ergebnisse von Sphinx, ist es sehr einfach neu zu ordnen:

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

Dies funktioniert, wenn Ihre $ sphinxs_results in der richtigen Reihenfolge sind.

seine fast pat's Antwort, aber mit weniger eine Schleife. Kann etwas Unterschied in großen Ergebnissen machen, schätze ich.

Verwandte Themen