存储库中的筛选器¶
pycsw 有能力执行服务器端存储库或数据库筛选功能,以覆盖所有的CSW请求,目的是查询元数据存储库中的一个特定子集,从而需部署多个 pycsw 实例,通过 repository.filter
配置选项,以不同的方式指向同一个数据库。
存储库中的筛选器是一种便捷方式,是为了创建子数据库,以免去创建适当数据库视图的服务器级别的步骤。 对于大型数据库而言,它可能比创建数据库级别的子集要更好一些。
场景 ︰ 一个数据库,很多种视角¶
想象一下,现在要记录数据库示例表(下面以子集做为简称):
标识 | 母标识符 | 标题 | 摘要 |
---|---|---|---|
1 | 33 | foo1 | bar1 |
2 | 33 | foo2 | bar2 |
3 | 55 | foo3 | bar3 |
4 | 55 | foo1 | bar1 |
5 | 21 | foo5 | bar5 |
5 | 21 | foo6 | bar6 |
若没有 repository.filters
选项,pycsw默认是始终处理整个表的CSW请求。CSW GetRecords 过滤如:
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>apiso:Title</ogc:PropertyName>
<ogc:Literal>foo1</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
...将返回:
标识 | 母标识符 | 标题 | 摘要 |
---|---|---|---|
1 | 33 | foo1 | bar1 |
4 | 55 | foo1 | bar1 |
假设你要部署其他pycsw应用实例,此实例来自同一个数据库的元数据,但它只能来自一个特定子集。在这里,我们设置了 repository.filter
选项:
[repository]
database=sqlite:///records.db
filter=pycsw:ParentIdentifier = '33'
依上述所说,同一CSW GetRecords 过滤器将得到以下结果:
标识 | 母标识符 | 标题 | 摘要 |
---|---|---|---|
1 | 33 | foo1 | bar1 |
另一个例子:
[repository]
database=sqlite:///records.db
filter=pycsw:ParentIdentifier != '33'
依上述所说,同一CSW GetRecords 过滤器将得到以下结果:
标识 | 母标识符 | 标题 | 摘要 |
---|---|---|---|
4 | 55 | foo1 | bar1 |
该 repository.filter
选项功能是在pycsw核心模式中接收所有核心查询设置(见``pycsw.config.StaticContext.md_core_model`` 的完整列表)。