2009-07-15 4 views
3

Ich wollte durch die django-Sphinx documentation, und es sieht aus wie Sie die Suchergebnisse filtern können mit , AttributeDjango-Sphinx Ergebnis Filterung mit Attributen?

queryset = MyModel.search.query('query') 
results1 = queryset.order_by('@weight', '@id', 'my_attribute') 
results2 = queryset.filter(my_attribute=5) 
results3 = queryset.filter(my_other_attribute=[5, 3,4]) 
results4 = queryset.exclude(my_attribute=5)[0:10] 

Von einigen Beispielen scheinen diese Attribute etwas, das Sie in der Sphinx angeben werden Konfigurationsdatei, anstatt tatsächliche Spaltenwerte in der Tabelle zu sein. Die Konfigurationsdatei kann so etwas,

# ForeignKey's 
# Apparently sql_group_column is now replaced by sql_attr_uint 
sql_group_column = country_id 
sql_group_column = state_id 
sql_group_column = listings 

# DateField's and DateTimeField's 
sql_date_column  = date_added 

Aber es stellt sich heraus, dass Sie nur Fremdschlüssel als dieser Wert angeben. Wie in another example dargestellt,

Class City(models.Model): 
    ... 
    # Comment: The below should probly be country_id and state_id 
    country_id  = models.ForeignKey(Country) 
    state_id  = models.ForeignKey(State, blank=True, null=True) 
    listings  = models.PositiveIntegerField(editable=False, default=0) 

Wenn das Suchergebnis gedruckt wird, erhalten Sie,

print results[0]._sphinx 
{'id': u'5246', 'weight': 200, 'attrs': {'state_id': 3, 'country_id': 0}} 

Wie Sie sehen können, in attrs - state_id und country_id - wobei FKs, zeigen. Aber Angebote nicht.

Und hier liegt mein Problem. Wenn ich meine Sphinx-Suchergebnisse mit einer Aribtrary-Spalte foo in meinem Modell filtern möchte - wie würde ich das machen?

Danke!


bearbeiten

In Antwort auf Van Gale,

Ich verwende sql_attr_uint eigentlich eher als sql_group_column hier .. und wie ich im Beispiel oben erwähnt .. auch das Beispiel des Autors von Django Sphinx (link oben) zeigt nicht das Attribut im _Sphinx dict, wenn es nicht ein FK ist .. (Siehe die "Wie Sie sehen" Aussage oben). Auch ich habe bereits die SQL_Query Zeichenfolge zu .. es wählt alle Spalten in meiner Tabelle .. (individuell, nicht *)

+0

Haben Sie eine Lösung für dieses Problem erhalten? Ich stecke sie fest ... –

Antwort

1

Es ist fast ein Jahr her, seit ich ein Projekt mit Django-Sphinx, also meine Erinnerung ist ein etwas verschwommen. Aber da ich wusste, dass ich in der Lage war, normale Spalten zu filtern, poste ich nur die relevanten Teile meiner sphinx-Konfiguration und vielleicht hilft das auch.

sphinx.conf:

sql_query_pre  = 
sql_query_post  = 
sql_query   = SELECT `id`, `content_type_id`, `site_id`, `user_id`, `title`, `abstract`, `summary`, `fulltext`, `approved` FROM `basedoc` 
sql_query_info  = SELECT * FROM `basedoc` WHERE `id` = $id 

sql_attr_uint = content_type_id 
sql_attr_uint = site_id 
sql_attr_uint = user_id 
sql_attr_uint = approved 

Wie man sehen kann, hatte ich eine nicht-fk-Säule (genehmigt) und tat Filter auf es in der django Ansicht. Also ich schätze Ihr Problem ist, Sie brauchen sql_attr_uint anstelle von , und fügen Sie die sql_query Strings.

+0

Danke für Ihre Antwort - aber ich benutze bereits sql_attr_uint, und habe alle Spalten in meiner Tabelle als Teil der Select-Abfrage .. außer, ich verwende nicht die '', um jeden Spaltennamen zu markieren. Ich bin mir nicht sicher, ob das alleine einen Unterschied machen könnte, aber ich werde es ausprobieren. – viksit

+0

BTW - Ich bin immer noch mit diesem Problem fest. Ich habe mich gefragt - wie hast du deine Filterung in der Ansicht gemacht? Vielleicht mache ich das falsch? – viksit

+0

Als ich an dem Prototyp-Projekt mit django-sphinx arbeitete, gab es einen Fehler, bei dem Filter nicht richtig zurückgesetzt wurden (d. H. Wenn du einen Filter benutzt hast, würde er immer auf jede Suche angewendet, auch wenn du sie nicht willst). Es wurde seither behoben, aber aufgrund dieses Fehlers konnte ich offensichtlich keine Filter verwenden. Ich musste das benutzen.query() -Methode und dann manuell die Datensatz-IDs selbst ausfiltern. Ich bearbeite meinen Beitrag, um zu zeigen, wie ich Filter verwendet habe, weil sie für mich anders als das Reset-Problem funktioniert haben. –