2012-04-05 8 views
0

Ich versuche, mehrere MySQL-Tabellen mit verschiedenen Feldern mit Sphinx zu durchsuchen und alle Ergebnisse in einem einzigen Satz basierend auf Relevanz zu kombinieren.Sphinx Suche mehrere Tabellen und aggregierte Ergebnisse mit PHP API

Ich habe Sphinx mit einem Index für jede Tabelle konfiguriert und bin erfolgreich die Ergebnisse durch die Suche nach allen Indizes auf einmal.

Wenn ich abfragen mit SEARCH durch die Shell bekomme ich alle Ergebnisinformationen zurück wie erwartet. Wenn ich jedoch die PHP-API verwende, kommt das Ergebnis nur mit den IDs der Zeilen zurück und daher kann ich nicht feststellen, aus welcher Tabelle es stammt.

Gibt es eine Möglichkeit, die PHP-API dazu zu bringen, mir zu sagen, aus welcher Tabelle/welchem ​​Index sie stammt, damit ich nach den tatsächlichen Daten suchen kann?

Die Alternative, die ich betrachte, versucht, die Ausgabe von der Shell-Skript zu verarbeiten, aber das scheint chaotisch.

Hier ist das PHP: $ search = $ _GET ['query']; // Verbindungsinformationen $ sphinxClient = new SphinxClient(); $ sphinxClient-> SetServer ('localhost', 9312); $ sphinxClient-> SetMaxQueryTime (5000);

//Sphinx Result Configuration 
$sphinxClient->SetMatchMode(SPH_MATCH_ANY); 
$sphinxClient->SetRankingMode(SPH_RANK_PROXIMITY_BM25); 
$sphinxClient->SetLimits(0, 20); 

// Give me back the results as an array 
$sphinxClient->SetArrayResult(true); 

$searchResults = $sphinxClient->Query($search, 'user model'); 

Die Shell-Skript ist einfach:

./search SEARCHTERM 

wo SUCHBEGRIFF der

, die etwas suchen ist ausgibt, das wie folgt aussieht:

Sphinx 2.0.3 -Release (r3043) Copyright (c) 2001-2011, Andrew Aksyonoff Urheberrecht (c) 2008-2011, Sphinx Technologies Inc. (http://sphinxsearch.com)

mit der Konfigurationsdatei '/ usr/local/sphinx/etc/sphinx conf '... Index 'user': query' NEWTON ‚: ergab 10 Treffer von 10 gesamt in 0.000 sec

Anzeige Spiele: 1. Dokument = 1, Gewicht = 2629, Zeit = Do 1. Januar 00 : 33: 32 1970 id = 1 first_name = Joe last_name = Shmo company = Acme

Der PHP-API Output im JSON-Format: { "Fehler": "", "Warnung": "", "Status": "gut", "Felder": [ "Name", "CODE_NAME" , "code", "beschreibung", "rating", "angle", "publicated", "key_words", "referred_num", "genehmigt", "used_num", "avg_runtime", "beispiele", "editor" publiced_time "], " attrs ": {" time ": 2}, " Übereinstimmungen ": { {" id ": 1," Gewicht ":" 1 "," attrs ": {" time ": 2012 }} ], "gesamt": "1", "total_found": "1", "zeit": "0.000" , "Worte": { "posuere": { "docs": "1", "Hits": "2"}} }

+1

Bitte fügen Sie den Code verwenden können, wo Sie die PHP-API-Suche durchführen, so ist es klarer, wie du das machst. Bitte dokumentieren Sie die Shell-Befehlszeile, die Sie ausführen, damit sie miteinander verglichen werden können. – hakre

+0

./search shell script wurde nicht für den produktiven Einsatz entwickelt. Es ist ein Tool zum Debuggen und Überwachen von Status und Inhalt der Indizes. Sie sollten stattdessen Sphinx API verwenden. –

Antwort

1

Es ist normal, dass Sphinx führt zurück (Zeile) Objekt-IDs. Das Problem liegt in Ihrem Modell. Wenn Sie anhand der ID nicht feststellen können, um welches Objekt es sich handelt, ist Ihr Modell falsch. Die möglichen Optionen sind:

  • einen separaten Sphinx Index pro einem Objekttyp (Tabelle oder eine Gruppe von verknüpften Tabellen) erstellen
  • Ihre Objekte numeration verbessern, um mögliche Objekte Identifizierung zu machen, durch eine Vorfixierung zum Beispiel.
3

Ich bin ziemlich sicher, dass bei der Suche, obwohl die API Sie don‘ t erhalten nur die Ids der Dokumente passend, sondern auch alle anderen int Werte des Dokuments gefunden.

So könnte man wie jetzt

SELECT id, "1" as type FROM table1 

sql_attr_uint = type 

und type Feld hinzufügen in Ihrer Quelle etwas versuchen sagt Ihnen, welche Tabelle die ID ist von

Bitte nicht Es gibt jedoch ein paar Probleme beim Durchsuchen mehrerer Indizes verschiedener Tabellen gleichzeitig.

  1. Sie müssen sicherstellen, dass die ID nicht mehr in der Ergebnismenge, dass, sobald angezeigt wird (in der Regel die vorgeschlagene Lösung die ID von 1000000 oder durch eine ähnliche Art und Weise zu Pad sein würde - was ich persönlich schrecklich finden)

  2. Die Ergebnisse enthalten nur die Spalten des ersten gesuchten Indexes. Sie müssen sicherstellen, dass alle Ihre Quellen die gleichen Spalten zurückgeben.

Persönlich endete jedes Mal, wenn ich dachte an mehrere Indizes auf einmal suchen, ich jedes einzeln gesucht und die Ergebnisse als solche zu präsentieren.

Update: Hinzugefügt wurde die sql_attr_uint

benötigt
+0

Danke für die Antwort, es ist sehr hilfreich. Wie würde man die ID-Werte auffüllen, um die Eindeutigkeit sicherzustellen? In der SQL-Abfrage selbst? Kannst du den zweiten Teil auch etwas mehr erklären? Die Ausgabe, die ich von der API erhalte, die ich oben poste, gibt die Werte von keiner der Spalten zurück, also nahm ich an, dass dies kein Problem wäre. –

+0

@BrianPeacock, poste auch deine Sources-Definition und ich werde dir antworten – mobius

0

, wenn die Tabellen haben die gleiche Struktur, die Sie Vereinigung mit SQL-Abfragen

SELECT * FROM table1 WHERE id IN (ids,from,sphinx) 
UNION 
SELECT * FROM table2 WHERE id IN (ids,from,sphinx) 
... 
UNION 
SELECT * FROM tableN WHERE id IN (ids,from,sphinx) 

Vorsicht, dass diese CPU-intensiv ist

Verwandte Themen