MarkLogic - 在每个提取的文档中运行CPF,其中URI是" name.xml"没有目录或斜杠

时间:2016-05-26 14:21:19

标签: marklogic

我们需要为我们提取的每个文档添加一个集合,并且希望使用CPF,因为集合将取决于文档中的数据。

我们的文档URI是: GUID.xml 前面没有正斜杠或目录。

我们试图让CPF触发使用:

文档范围=目录

uri = /

文档范围=文档

uri = /

我们的理论是,CPF期望文档URI以正斜杠开头,但因为它们不会触发CPF。

我们已经考虑过为每个文档添加基本集合的粗略解决方案,并将其作为CPF的文档范围,但显然这是我们不需要添加的不必要数据。

我们将不胜感激任何想法或解决方案。

2 个答案:

答案 0 :(得分:5)

我在Domain Scope section of the CPF Guide

中找到了这个
  

在管理界面中,文档范围下拉列表指定域是应用于单个文档,目录还是集合。每个域只能有一个这样的文档范围;如果您需要多个文档范围,则可以创建多个域。

换句话说,要在多个文档上使用CPF,您需要使用目录或集合来稍微组织数据。

另请注意,CPF指南中写着“Do not overlap domains”。这意味着如果您希望CPF更精确地定位内容,您仍然需要更具体的内容组织(例如,针对不同类型或内容源的不同目录)。这在搜索过程中也很有用。在不了解您的数据的情况下,我无法建议您如何分解它,但某种组织通常很有帮助。

您需要在数据加载方面做一些不同的事情。我认为你阻力最小的路径是在URI的开头添加一个/。

答案 1 :(得分:4)

我支持Dave的帖子作为适当的答案。但是,为了完整起见,我更深入地了解了CPF和触发器协同工作的方式以及如何使用可用工具完成您想要的工作。但即使你可以'对它进行修改,斜线会更加整洁。

我同意Dave关于' /'的建议。从斜线开始在ML中是一件好事(当然不是必需的)。但是,我遇到了一些假设一开始就有斜线的事情。

但是,这需要改变你所拥有的东西 - 而且MarkLogic有很多好东西,所以我们可以随意翻找,看看我们可以尝试其他一些技巧。

什么是CPF? 它是一个构建在触发器之上的应用程序,可以完成一些非常方便的操作,并且可以高度配置管道。 - 重要的是,在引擎盖下,它在触发器上运行。 - 并且触发器需要范围(没有通配符或空范围)。

现在,MarkLogic非常清楚“#”目录'以斜线结尾。这适用于根目录。因此,根据您的URIS,无法在示例中使用目录范围或文档范围。

但我们仍然使用trgr:collection-scope()来玩。怎么样? 嗯,这很简单: - 对于用于插入文档的任何用户,添加默认集合(在管理面板下) - >安全性 - >用户[或角色] - 然后定义触发器。

对我来说,我添加了一个名为'默认'的默认集合。以及以下触发器定义:

trgr:create-trigger("myTrigger2", "Simple trigger example", 
  trgr:trigger-data-event(
  trgr:collection-scope("default"),
  trgr:document-content("create"),
      trgr:post-commit()),
  trgr:trigger-module(0, "/dae/", "log.xqy"),
  fn:true(), xdmp:default-permissions() )

因此,现在可以触发文档,因为插入文档的用户已经定义了一个集合(在此触发器运行时已经可用)。是的,这是CPF的业务端 - 集合范围与CPF配置中的相同。

本质上,文档的范围由用户插入它们的集合(默认集合)。有了它,你可以说触发器也是作用于该用户的插入。在MarkLogic中,您总是拥有一个用户 - 即使它是默认用户。

路径是这样的:文档 - >插入默认集合 - >触发器被触发,因为为默认集合定义了集合范围。