【问题标题】:Django-sphinx result filtering using attributes?Django-sphinx 使用属性过滤结果?
【发布时间】:2010-11-11 04:55:32
【问题描述】:

我正在浏览 django-sphinx documentation,看起来它允许您使用 attributes 过滤搜索结果,

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 作为这个值。如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)

当搜索结果被打印出来时,你会得到,

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

如您所见,出现在 attrs - state_id 和 country_id - 作为 FK。但列表没有。

这就是我的问题。如果我想在我的模型中使用任意列 foo 过滤我的 sphinx 搜索结果 - 我该怎么做?

谢谢!


编辑

作为对范盖尔的回答,

我实际上在这里使用 sql_attr_uint 而不是 sql_group_column.. 并且正如我在上面的示例中提到的.. 即使是 Django Sphinx 的作者的示例(上面给出的链接)也没有显示 _Sphinx 字典中的属性如果它不是 FK ..(请参阅上面的“如您所见”声明)。另外,我也已经有了 SQL_Query 字符串..它选择了我表中的所有列..(单独,不是 *)

【问题讨论】:

  • 你有解决这个问题的办法吗?我被她困住了……

标签: django search filter sphinx resultset


【解决方案1】:

我用 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 字符串。

【讨论】:

  • 感谢您的回答 - 但我已经在使用 sql_attr_uint,并将表中的所有列作为选择查询的一部分。除了,我没有使用 `` 来标记每个列名。不确定仅此一项是否会有所作为,但我会尝试一下。
  • 顺便说一句-我仍然遇到这个问题。我想知道-您最终是如何在视图中进行过滤的?也许这就是我做错了?
  • 当我使用 django-sphinx 处理原型项目时,有一个错误导致过滤器无法正确重置(即,一旦你使用了过滤器,它总是适用于之后的每个搜索,即使你不想要)。它已经被修复了,但是由于这个错误,我显然不能使用过滤器。我不得不使用 .query() 方法,然后自己手动过滤掉记录 ID。我将编辑我的帖子以展示我如何使用过滤器,因为它们确实对我有用,而不是重置问题。
  • 呸,我很抱歉,但我们将源代码迁移到了 git 并且只保留了最新版本的代码(它只是一个已停止使用的原型站点)。所以我在任何地方都没有使用狮身人面像过滤器的旧代码的副本......对不起:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2019-01-06
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多