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 回答的微调。)
在 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 回答的微调。)