如何识别 MarkLogic 服务器中的重复文档?

How to identify duplicate documents in MarkLogic server?

我在 MarkLogic 服务器中创建了一个数据库,并为同一个数据库附加了一个林。如何识别 Marklogic 数据库中的重复文档?

例如,我在 URI 中有 C.xml /A/B/c.xml/D/E/c.xml 都是同一个林和同一个数据库。如何判断c.xml是否重复?

为了比较两个文档并确定它们是否重复(加载不同 URI 的相同文档),您可以使用 fn:deep-equal() 函数。

例如:

let $doc1 := fn:doc("/A/B/c.xml")
let $doc2 := fn:doc("/D/E/c.xml")
return fn:deep-equal($doc1, $doc2)

没有 "two documents" 是 "the same"。时期。因此,没有重复的文件。问题已解决。

这导致答案取决于 "duplicate" 的定义。如果您的意思是 "has the same semantic data content" 那么 deep-equal 方法将适用于 xml 文件,但如果您打算将非语义差异视为属性之间的额外空格、属性排序、名称空间前缀等,则会失败. 如果你的意思是 "same content and same properties, permissions, collections etc" 那需要额外的检查。
如果您知道 GIT 是如何工作的,那将是一个很好的心智模型。您可以有 2 个内容相同的文件,但这并不意味着它们是 'duplicates' --
一个更微妙的问题是,如果您指的是 2 个具有相同 URI 的文档——那么 可以 如果您在森林中闲逛,就会发生这种情况。创建 2 个数据库,将 /a.xml 放入每个数据库中,然后将森林与一个数据库分离并将其附加到另一个数据库——现在您可以拥有具有相同 URI 的 2 个文档(具有相同或不同的内容)。不要那样做。 对于非 xml 文档(或 xml 文档),您可以比较文本序列化格式——我建议您对所有文档计算一个哈希值(如 md5)——然后您可以比较散列以查看文档 * 是否具有相同的规范化文本内容”(与 'duplicate' 不同)