【发布时间】:2017-02-23 22:54:40
【问题描述】:
在 Wagtail 关于 ElasticSearch indexing 的文档中,似乎给定模型的所有实例都已添加到索引中。但我想通过创建 QuerySet 或能够设置某种 exclude 参数(QuerySet 会更好)来排除一些(许多)行被索引。
有没有办法做到这一点?还是我需要从 Wagtail 外部索引 WT 模型?
【问题讨论】:
在 Wagtail 关于 ElasticSearch indexing 的文档中,似乎给定模型的所有实例都已添加到索引中。但我想通过创建 QuerySet 或能够设置某种 exclude 参数(QuerySet 会更好)来排除一些(许多)行被索引。
有没有办法做到这一点?还是我需要从 Wagtail 外部索引 WT 模型?
【问题讨论】:
您可以在模型类上定义get_indexed_objects 方法,返回要索引的项目的查询集:
@classmethod
def get_indexed_objects(cls):
return cls.objects.filter(live=True)
【讨论】:
如果您想完全排除整个 Wagtail Page 模型的索引,这似乎可行(作为实例方法):
def get_indexed_instance(self):
return None
供参考:
【讨论】:
如果您只需要对结果执行一些简单的过滤,我建议您索引所有内容并在查询时进行过滤(除非您排除大量文档以节省硬盘空间):
MyModel.objects.filter(live=True).search("..")
Wagtail 会将该过滤器转换为 Elasticsearch 查询的一部分,因此这不会对性能产生任何明显影响。这确实需要使用index.FilterField 对所有过滤器字段进行索引(如果您使用页面模型,Wagtail 已经为所有基本页面字段完成了此操作)。
这种方法的主要优点是,如果您将来需要为单独的搜索功能执行此操作,您可以轻松删除过滤器。例如,Wagtail 这样做是为了允许搜索管理员中的所有页面,但只搜索前端的实时页面。
【讨论】:
您可以通过将其添加到模型中来排除整个 Wagtail Page 模型的索引:
@classmethod
def get_indexed_objects(cls):
"""
Hide model from search results.
"""
return cls.objects.none()
(这是对尼克答案的调整。)
【讨论】: