【问题标题】:Wagtail indexing: Exclude some content or use queryset?Wagtail 索引:排除某些内容或使用查询集?
【发布时间】:2017-02-23 22:54:40
【问题描述】:

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

有没有办法做到这一点?还是我需要从 Wagtail 外部索引 WT 模型?

【问题讨论】:

    标签: django wagtail


    【解决方案1】:

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

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

    【讨论】:

    • 工作得很好,谢谢!我很快就会为此提交一个文档补丁。
    【解决方案2】:

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

    def get_indexed_instance(self):
        return None
    

    供参考:

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 谢谢卡尔。在我们的案例中,可能存在一些隐私问题,我们需要小心围绕某些记录,因此将它们排除在索引之外很重要。但作为一种通用方法,您是对的 - 为所有内容编制索引,然后进行过滤,总体上为您提供了更大的灵活性。
      【解决方案4】:

      您可以通过将其添加到模型中来排除整个 Wagtail Page 模型的索引:

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

      (这是对尼克答案的调整。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 2013-02-19
        • 2013-09-16
        • 1970-01-01
        • 2018-11-15
        • 2017-03-28
        相关资源
        最近更新 更多