11

这让我有点生气,但似乎应该很简单。

我正在使用 Django 和 Haystack,并且有一个搜索索引,其中包括一个允许 null 的 IntegerField。这是基于 Django 中的相关模型,但我认为这并不重要。例如:

class ThingIndex(indexes.ModelSearchIndex, indexes.Indexable):
    group = indexes.IntegerField(model_attr='group__id', null=True)

    class Meta:
        model = Thing

我有时希望我的 Haystack 查询为此字段返回具有 None/Null 的项目,因此我在搜索表单的 __init__ 中进行过滤,但我无法获得执行此操作的查询。我尝试过的最明显的方法是:

self.searchqueryset.filter(group__isnull=True)  # how to do it on a regular Django queryset

但这不会返回任何记录。

现在我正在解决这个问题:

self.searchqueryset.exclude(group__in=range(1,100))

哪个有效,但显然不应该这样做:)

任何人都可以帮忙吗?

谢谢!

4

3 回答 3

13

如果您使用的是 ElasticSearch,则无需打补丁即可完成解决方案,只需使用原生 ElasticSearch:

from haystack.inputs import Raw
self.searchqueryset.exclude(group = Raw("[* TO *]"))

反过来,过滤所有具有非空组字段的文档:

from haystack.inputs import Raw
self.searchqueryset.filter(group = Raw("[* TO *]"))

这也适用于 SOLR 和其他应用相同概念但具有后端搜索语言特定语法的 Haystack 后端。

参考:

于 2014-03-22T11:15:17.760 回答
13

我觉得这个问题没有得到回答。似乎操作员正在询问如何使用带有 ElasticSearch 后端的 haystack.query.SearchQuerySet 过滤空条目。

在上面的示例中,替换

self.searchqueryset.filter(group__isnull=True)

self.searchqueryset.filter(_missing_='group')

不直观,但它是迄今为止我让它工作的唯一方法。

于 2015-03-24T23:37:45.420 回答
3

如果您使用 SOLR,您可能希望查看以下链接:

1) https://github.com/toastdriven/django-haystack/commit/9332a91a7f0e4b33d7e20aa892d156305c12dfe3
2) https://github.com/toastdriven/django-haystack/issues/163

SOLR 有一个补丁,允许这样的查询,但对于其他后端可能没有。

于 2013-11-14T12:52:03.963 回答