2009-07-15 15 views
3

Je traversais le django-sphynx documentation, et il semble que cela vous permet de filtrer les résultats de recherche en utilisant les attributs ,Filtrer les résultats de Django-sphinx en utilisant des attributs?

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] 

De quelques exemples, ces attributs semblent être quelque chose que vous spécifiez dans le sphynx fichier de configuration, plutôt que d'être des valeurs de colonne réelles dans la table. Le fichier de configuration permet quelque chose comme ça,

# 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 

Mais il se trouve que vous ne pouvez spécifier des clés étrangères que cette valeur. Comme illustré dans another example,

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) 

Lorsque le résultat de recherche est imprimé, vous obtenez,

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

Comme vous pouvez le voir, attrs - state_id et country_id - être FKs, apparaissent. Mais les listes ne le font pas.

Et voilà mon problème. Si je veux filtrer mes résultats de recherche sphinx en utilisant une colonne aribtrary foo dans mon modèle - comment le ferais-je?

Merci!


Modifier

En réponse à Van Gale,

Je suis en fait à l'aide sql_attr_uint plutôt que sql_group_column ici .. et comme je l'ai mentionné dans l'exemple ci-dessus .. même l'exemple de l'auteur de Django Sphinx (lien donné ci-dessus) n'affiche pas l'attribut dans la dict _Sphinx si ce n'est pas un FK .. (Voir l'instruction "Comme vous pouvez le voir" ci-dessus). Aussi, j'ai déjà la chaîne SQL_Query aussi .. il sélectionne toutes les colonnes dans ma table .. (individuellement, pas *)

+0

avez-vous eu une solution à ce problème? Je suis coincé elle ... –

Répondre

1

Cela fait presque un an que j'ai fait un projet en utilisant django-sphinx, donc ma mémoire est un Un peu brumeux à ce sujet. Mais, sachant que j'étais capable de filtrer sur des colonnes normales, je posterai juste les parties pertinentes de ma configuration de sphinx et peut-être que cela aidera.

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 

Comme vous pouvez le voir, j'avais une colonne non-fk (approuvé) et ne filtre dans la vue django. Donc, je suppose que votre problème est que vous avez besoin sql_attr_uint au lieu de , et ajouter les chaînes sql_query.

+0

Merci pour votre réponse - mais j'utilise déjà sql_attr_uint, et ai toutes les colonnes dans ma table dans le cadre de la requête select .. excepté, je n'utilise pas le '' pour marquer chaque nom de colonne. Je ne sais pas si cela seul pourrait faire la différence, mais je vais essayer. – viksit

+0

Btw - Je suis toujours coincé avec ce problème. Je me demandais - comment avez-vous fini par faire votre filtrage dans la vue? Peut-être que c'est ce que je fais mal? – viksit

+0

Lorsque je travaillais sur le projet prototype en utilisant django-sphinx, il y avait un bug où les filtres ne se réinitialisaient pas correctement (c'est-à-dire que si vous utilisiez un filtre, il s'appliquerait à chaque recherche même si vous ne le vouliez pas). Il a depuis été corrigé mais, à cause de ce bug, je ne pouvais évidemment pas utiliser de filtres. Je devais utiliser le.méthode query(), puis filtrer manuellement l'ID d'enregistrement moi-même. Je vais modifier mon post pour montrer comment j'ai utilisé les filtres, car ils ont travaillé pour moi autre que le problème de réinitialisation. –