Фильтрация результатов Django-sphinx по атрибутам - PullRequest
3 голосов
/ 16 июля 2009

Я просматривал документацию django-sphinx , и похоже, что она позволяет фильтровать результаты поиска с использованием атрибутов ,

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]

В некоторых примерах эти атрибуты, по-видимому, задаются в файле конфигурации sphinx, а не являются фактическими значениями столбцов в таблице. Файл конфигурации позволяет что-то вроде этого,

# 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

Но оказывается, что вы можете указать только Foreign Keys в качестве этого значения. Как показано в другом примере ,

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)

Когда результат поиска печатается, вы получаете,

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

Как видите, в attrs - state_id и country_id - FKs, отображаются. Но списки не.

И здесь кроется моя проблема. Если я хочу отфильтровать результаты поиска сфинксов с помощью столбца aribtrary foo в моей модели - как бы я это сделал?

Спасибо!


Редактировать

В ответ Ван Гэйлу,

Я на самом деле использую sql_attr_uint, а не sql_group_column здесь ... и, как я уже упоминал в приведенном выше примере ... даже в примере от автора Django Sphinx (ссылка приведена выше) не отображается атрибут в dict _Sphinx, если это не FK .. (см. утверждение «Как вы можете видеть» выше). Кроме того, у меня уже есть строка SQL_Query .. она выбирает все столбцы в моей таблице .. (индивидуально, а не *)

1 Ответ

1 голос
/ 16 июля 2009

Прошел почти год с тех пор, как я делал проект с использованием django-sphinx, так что моя память немного запутана в этом. Но, зная, что я могу фильтровать по обычным столбцам, я просто опубликую соответствующие части моей конфигурации sphinx, и, возможно, это поможет.

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

Как видите, у меня был столбец не-fk (одобрено), и я применил фильтр к нему в представлении django. Я предполагаю, что ваша проблема в том, что вам нужно sql_attr_uint вместо sql_group_column и добавить строки sql_query.

...