2

我在 search_indexes.py 中有 3 个具有 3 个索引的模型,例如(Modelname1Index、ModelName2Index、Modelname3Index)。

SearchQuerySet().filter 是从所有三个中搜索的,但我想分别搜索它们中的每一个。

所以,我试着这样做:

SearchQuerySet().filter(text=query).models(required_model_name)

但是,它返回的结果来自整个搜索(来自所有模型),而不是来自提到的单个模型。

此外,在进行重建索引时,没有为第三个模型编制索引的对象,因为该模型没有任何行。

因此, .models(thirdmodel) 返回空结果,但 .models(任何其他两个模型) 返回整个结果。

4

2 回答 2

3

不幸的是,.models()过滤器无法与最新版本的 Haystack 和 Whoosh 一起正常工作。

您可以通过将 Haystack 降级到 2.0.0 并将 Whoosh 降级到 2.4.1 来解决这个问题。

另请注意,使用 Whoosh 时,您会在尝试HAYSTACK_SEARCH_RESULTS_PER_PAGE在配置中使用时遇到错误,因此您最好避免使用此设置。
不过,这还不算太可怕。

于 2013-10-21T18:48:10.137 回答
1

这部分基于 James Lims 的回答,但这应该适用于任何版本的 Haystack 和 Whoosh。不幸的是,双方都没有真正在这方面进行救援,但下面的解决方案似乎并不算太​​糟糕。

class MySearchQuerySet(SearchQuerySet):
    def models(self,*mods):
        # We have to redefine this because Whoosh & Haystack don't play well with model filtering
        from haystack.utils import get_model_ct
        mods = [get_model_ct(m) for m in mods]
        return self.filter(django_ct__in=mods)

然后在哪里SearchQuerySet使用MySearchQuerySet

MySearchQuery().filter(name="foo").models(my_models.bar,my_models.baz)
于 2014-11-26T08:13:35.650 回答