默认过滤器

https://blueprints.launchpad.net/searchlight/+spec/overridable-default-filters

本规范旨在支持插件中的场景,即某个过滤器应该应用于大多数搜索,但应该允许用户覆盖它。

问题描述

目前已识别的两个支持默认(但可覆盖)过滤器的案例是 glance 的社区镜像和 nova 删除的服务器实例。 在这两种情况下,都存在应该默认应用于搜索的查询子句,但用户应该能够显式禁用它们。

提议的变更

除了应用于每个插件基础上所有查询的 RBAC 过滤器之外,此更改将允许插件指定将与 RBAC 过滤器一起默认应用的额外过滤器。 然而,对于这些默认值,查询构建器将检查传入的查询中是否存在将被过滤的字段的任何实例,排除用户显式指定的任何过滤器。

此解决方案将存在一些缺陷。 query_string 子句本质上难以分析; 我们可以尝试在以 & 分隔后查找 key: 的实例。 对于结构化查询,查找结构化查询中过滤器的键应该足够了。

此外,将很难/不可能知道过滤器是否应该仅针对特定类型被覆盖(例如,如果 deleted 是 Nova 服务器插件的默认过滤器,即使它并非有意应用于 Nova 服务器,它也会从包含 deleted 作为术语的任何查询中删除)。

鉴于 Elasticsearch DSL 的灵活性,这些限制在某种程度上是不可避免的。 删除这些过滤器的案例足够具体,以至于边缘情况并不重要。

备选方案

没有,但这限制了 Searchlight 在 Nova 的 cells 中的使用,以及匹配 Glance API 关于社区镜像的能力。

另一种实现选项是在查询的最顶层提供一个特定的“禁用默认过滤器”选项。 这将更安全、性能更高、更可预测,但需要了解这些默认值(例如,搜索 _type:OS::Nova::Server AND deleted 不会返回任何内容,除非提供了额外的覆盖参数)。

参考资料