Wagtail 索引:排除某些内容或使用查询集?

Wagtail indexing: Exclude some content or use queryset?

在 Wagtail 关于 ElasticSearch indexing 的文档中,似乎给定模型的所有实例都已添加到索引中。但是我想通过创建 QuerySet 或能够设置某种 exclude 参数(QuerySet 会更好)来排除一些(许多)行被索引。

有什么办法吗?或者我需要从 Wagtail 外部索引 WT 模型吗?

您可以在模型 class 上定义一个 get_indexed_objects 方法,返回要索引的项的查询集:

@classmethod
def get_indexed_objects(cls):
    return cls.objects.filter(live=True)

如果您只需要对结果执行一些简单的过滤,我建议对所有内容进行索引并在查询时进行过滤(除非您排除了相当多的文档以节省硬盘space):

MyModel.objects.filter(live=True).search("..")

Wagtail 会将过滤器转换为 Elasticsearch 查询的一部分,因此这不会对性能产生任何显着影响。不过,这确实需要使用 index.FilterField 对所有过滤器字段进行索引(如果您使用页面模型,Wagtail 已为所有基本页面字段完成此操作)。

这种方法的主要优点是,如果您将来需要为单独的搜索功能执行此操作,则可以轻松删除过滤器。例如,Wagtail 这样做是为了允许搜索管理中的所有页面,但只搜索前端的活动页面。

如果您想完全排除整个 Wagtail Page 模型被索引,这似乎可行(作为实例方法):

def get_indexed_instance(self):
    return None

供参考:

您可以将整个 Wagtail Page 模型添加到您的模型中以排除其被编入索引:

@classmethod
def get_indexed_objects(cls):
    """
    Hide model from search results.
    """
    return cls.objects.none()

(这是对 Nick 回答的微调。)