MarkLogic - 在 URI 为 "name.xml" 且没有目录或斜杠的每个摄取文档上制作 CPF 运行
MarkLogic - Make CPF run on every ingested document where the URIs are "name.xml" with no directories or slashes
我们需要为我们摄取的每个文档添加一个集合,并且希望使用 CPF,因为该集合将取决于文档中的数据。
我们的文档 URI 是:GUID.xml 前面没有正斜杠或目录。
我们已尝试使用以下方法触发 CPF:
文档范围=目录
uri = /
和
文档范围=文档
uri = /
我们的理论是 CPF 期望文档 URI 以正斜杠开头,但由于它们不是,因此 CPF 不会触发。
我们考虑过使用一种粗略的解决方案,即向每个文档添加一个基本集合并将其用作 CPF 的文档范围,但显然这是添加了我们不需要的不必要数据。
我们将不胜感激任何想法或解决方案。
我在 Domain Scope section of the CPF Guide 中找到了这个:
In the Admin Interface, the document scope drop-down list specifies whether the domain applies to a single document, a directory, or a collection. Each domain can only have one of these document scopes; if you need more than one of these document scopes, you can create multiple domains.
换句话说,要在多个文档上使用 CPF,您需要使用目录或集合来稍微组织您的数据。
另请注意,CPF 指南上写着“Do not overlap domains”。这意味着,如果您希望 CPF 更精确地定位内容,您无论如何都需要更具体的内容组织(例如,不同类型或内容来源的不同目录)。这在搜索过程中也很有帮助。在对您的数据一无所知的情况下,我无法建议您如何分解它,但某种组织通常会有所帮助。
您需要在数据加载中做一些不同的事情。我认为您的阻力最小的途径是将 / 添加到您的 URI 的开头。
我支持 Dave 的 post 作为合适的答案。但是,为了完整起见,我深入探讨了 CPF 和触发器协同工作的方式,以及您如何使用可用工具完成您想要的工作。但是即使你 'can' accmoplish 它,斜杠也会更整洁。
我同意 Dave 关于“/”的建议。以斜杠开头在 ML 中是一件好事(当然不是必需的)。但是,我 运行 处理了一些假设开头有斜线的事情。
但是,这需要改变您拥有的东西 - MarkLogic 有很多隐藏的好东西,所以我们可以四处翻找一下,看看我们可以尝试哪些其他技巧。
什么是公积金?
它是一个建立在触发器之上的应用程序,可以做一些非常方便的事情,并且对于管道是高度可配置的。
- 重要的是,在引擎盖下,它 运行 在触发器上。
- 并且触发器需要一个范围(无通配符或空范围)。
现在 MarkLogic 非常清楚 'directory' 以斜线结尾。这适用于根目录。因此,无法根据您的 URIS 在您的示例中使用目录范围或文档范围。
但是我们还有 trgr:collection-scope() 可以玩。如何?
嗯,这很简单:
- 对于用于插入文档的任何用户,添加一个默认集合(在管理面板下)->安全->用户[或角色]
- 然后定义触发器。
对我来说,我添加了一个名为 'default' 的默认集合和以下触发器定义:
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() )
因此,现在可以触发文档,因为插入它们的用户已经定义了一个集合(在触发 运行s 时已经可用)。是的,这是 CPF 的业务端 - 收集范围与 CPF 配置中的相同。
本质上,文档的范围由用于插入它们的用户限定到一个集合(默认集合)。这样,您就可以说触发器的范围也仅限于该用户的插入。在 MarkLogic 中,你总是有一个用户——即使它是默认用户。
路径是这样的:文档->插入默认集合->触发触发器,因为为默认集合定义了集合范围。
我们需要为我们摄取的每个文档添加一个集合,并且希望使用 CPF,因为该集合将取决于文档中的数据。
我们的文档 URI 是:GUID.xml 前面没有正斜杠或目录。
我们已尝试使用以下方法触发 CPF:
文档范围=目录
uri = /
和
文档范围=文档
uri = /
我们的理论是 CPF 期望文档 URI 以正斜杠开头,但由于它们不是,因此 CPF 不会触发。
我们考虑过使用一种粗略的解决方案,即向每个文档添加一个基本集合并将其用作 CPF 的文档范围,但显然这是添加了我们不需要的不必要数据。
我们将不胜感激任何想法或解决方案。
我在 Domain Scope section of the CPF Guide 中找到了这个:
In the Admin Interface, the document scope drop-down list specifies whether the domain applies to a single document, a directory, or a collection. Each domain can only have one of these document scopes; if you need more than one of these document scopes, you can create multiple domains.
换句话说,要在多个文档上使用 CPF,您需要使用目录或集合来稍微组织您的数据。
另请注意,CPF 指南上写着“Do not overlap domains”。这意味着,如果您希望 CPF 更精确地定位内容,您无论如何都需要更具体的内容组织(例如,不同类型或内容来源的不同目录)。这在搜索过程中也很有帮助。在对您的数据一无所知的情况下,我无法建议您如何分解它,但某种组织通常会有所帮助。
您需要在数据加载中做一些不同的事情。我认为您的阻力最小的途径是将 / 添加到您的 URI 的开头。
我支持 Dave 的 post 作为合适的答案。但是,为了完整起见,我深入探讨了 CPF 和触发器协同工作的方式,以及您如何使用可用工具完成您想要的工作。但是即使你 'can' accmoplish 它,斜杠也会更整洁。
我同意 Dave 关于“/”的建议。以斜杠开头在 ML 中是一件好事(当然不是必需的)。但是,我 运行 处理了一些假设开头有斜线的事情。
但是,这需要改变您拥有的东西 - MarkLogic 有很多隐藏的好东西,所以我们可以四处翻找一下,看看我们可以尝试哪些其他技巧。
什么是公积金? 它是一个建立在触发器之上的应用程序,可以做一些非常方便的事情,并且对于管道是高度可配置的。 - 重要的是,在引擎盖下,它 运行 在触发器上。 - 并且触发器需要一个范围(无通配符或空范围)。
现在 MarkLogic 非常清楚 'directory' 以斜线结尾。这适用于根目录。因此,无法根据您的 URIS 在您的示例中使用目录范围或文档范围。
但是我们还有 trgr:collection-scope() 可以玩。如何? 嗯,这很简单: - 对于用于插入文档的任何用户,添加一个默认集合(在管理面板下)->安全->用户[或角色] - 然后定义触发器。
对我来说,我添加了一个名为 'default' 的默认集合和以下触发器定义:
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() )
因此,现在可以触发文档,因为插入它们的用户已经定义了一个集合(在触发 运行s 时已经可用)。是的,这是 CPF 的业务端 - 收集范围与 CPF 配置中的相同。
本质上,文档的范围由用于插入它们的用户限定到一个集合(默认集合)。这样,您就可以说触发器的范围也仅限于该用户的插入。在 MarkLogic 中,你总是有一个用户——即使它是默认用户。
路径是这样的:文档->插入默认集合->触发触发器,因为为默认集合定义了集合范围。