据我了解,MLCP 转换和触发器都可用于修改摄取的文档。不同之处在于内容转换在摄取期间对内存中的文档对象进行操作,而触发器可以在创建文档后触发。
所以在我看来,我没有理由不能同时使用它们。我的用例是在将文档提取到数据库后,我需要更新文档的某些节点。我使用触发器的原因是因为在使用in-mem-update
模块的 MLCP 转换中运行相同的逻辑总是导致摄取失败,大概是由于文件大小过大和我尝试更新的节点数量过多。
2018-08-22 23:02:24 错误 TransformWriter:546 - 异常:解析 HTTP 标头时出错:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机无法连接回应
到目前为止,我还不能将内容转换和触发器结合起来。当我在 MLCP 摄取期间启用转换时,触发器未触发。当我禁用转换时,触发器没有问题。
我不能同时使用它们有什么内在原因吗?还是与我的配置有关的问题?谢谢!
编辑:
我想根据@ElijahBernstein-Cooper、@MadsHansen 和@grtjn(谢谢!)的建议,提供一些澄清和报告结果的背景。我正在使用 MarkLogic 数据中心框架将 PDF 文件(有些非常大)作为二进制文件提取,并将文本提取为 XML。我基本上遵循了这个例子,除了我使用xdmp:pdf-convert
的是xdmp:document-filter
:https ://github.com/marklogic/marklogic-data-hub/blob/master/examples/load-binaries/plugins/entities/Guides/input/LoadAsXml/内容/内容.xqy
虽然xdmp:pdf-convert
似乎比 更好地保留了 PDF 结构xdmp:document-filter
,但它还包括一些我不需要的样式节点 ( <link>
and <style>
) 和属性 ( class
and )。style
在尝试删除它们时,我探索了两种不同的方法:
- 第一种方法是使用该
in-mem-update
模块从上述content.xqy
脚本中的内存文档表示中删除不需要的节点,作为内容转换流程的一部分。问题是这个过程可能很慢,正如@grtjn 指出的那样,我必须限制并行化以避免超时。 - 第二种方法是使用提交后触发器功能在文档
xdmp:node-delete
被提取到数据库后使用它们来修改它们。但是,当触发条件设置为 时,触发器不会触发document-content("create")
。如果我将条件更改为,它确实会触发document-content("modify")
,但由于某种原因,我无法使用fn:document($trgr:uri)
类似于此 SO 问题的方式访问文档(MarkLogic 9 sjs 触发器无法访问 post-commit() 文档数据)。