2016-07-12 6 views
1

Gibt es eine Möglichkeit, diese Linie in Sphinx Suche zu tunWhere-Klausel hat oder Sphinx

where field_a = 'Value' or field_b = 'Value' 

habe ich versucht, so weit

$sphinx->where(field_A | field_B, '=', 'Value') 

Aber es funktioniert nicht. Könnte mir jemand helfen, damit fertig zu werden?

Antwort

4

Sphinx selbst unterstützt "OR" in der WHERE-Klausel nicht.

Aber kann wie etwas tun

SELECT id, (attribute_a = 'Value' OR attribute_b = 'Value') AS test 
FROM index 
WHERE test = 1 

Es ist ein wenig verworren, aber funktioniert. Auch keine Ahnung, welche Bibliothek Sie verwenden, um die Abfrage zu erstellen, so wie eine Übung zum Erstellen einer SQL-Abfrage wie oben links.

(Beachten Sie auch, Ich habe die Spalte zu nennen, Attribute statt. Sphinx behandelt Attribute und Felder sehr unterschiedlich. Diese Klärung ist eine Möglichkeit der Filterung Attribute)

+0

Hallo, barry. Ich schätze, ein Queyr wie oben schreibt einen vollständigen Scan der Attribute. Es ist möglicherweise Leistungsabfall, selbst wenn sie alle im Speicher gespeichert sind. Ich bin mir nicht sicher, ob ich einfach "SELECT ID FROM Index WHERE attribute_a = 1;" schreiben könnte, sphinx würde eine schnelle indizierte Suche durchführen, um alle Datensätze mit "attribute_a = 1" zu finden (möglicherweise durch eine rot-schwarze Baum- oder Hash-Map)) Oder braucht es noch einen Speicher-Full-Scan, selbst mit dieser einfachen Abfrage? Danke :-) – ASBai

+0

Beachten Sie, dass Attribut-basierte Abfragen in sphinx IMMER "vollständige Scans" sind. ** Die Attributfilter werden für jede Zeile ** ausgeführt. Es gibt keine Attributindizes. (Die Volltextabfrage verwendet andererseits einen speziellen Index, der etwas von dem sphinx, seinem magisch invertierten Index zum Ausführen schneller Textabfragen, ausgeht. Wenn es um die Leistung von Filtern geht, implementieren Sie via Felder. wird * normalerweise ** sei schneller als attributes) – barryhunter

+0

Danke für deine netten Tipps barry :-), So ** Filterung oder Sortierung nach Attributen in Sphinx wird immer durch "Full Scan" durchgeführt **. Das einzige, was wir die Abfrage-Performance optimieren können, ist ein entsprechendes Textfeld zu erstellen, damit sphinx seinen vollständigen invertierten Index wie folgt verwenden kann: 'MATCH ('@ attr_a 1 | 2 | 3')'? Oder könnten wir ein UDF-Plugin erstellen, einen schnellen Index darin pflegen und sphinx dieses Plugin verwenden lassen, um die Attribute abzufragen und zu sortieren? Genau wie das, was wir getan haben, um dieses Problem zu lösen: http://sphinxsearch.com/forum/view.html?id=14391 – ASBai