【问题标题】:Search XML document with the largest size in a MarkLogic database在 MarkLogic 数据库中搜索大小最大的 XML 文档
【发布时间】:2019-06-18 14:20:35
【问题描述】:

我想使用 XQuery 从 MarkLogic 查询控制台搜索 MarkLogic 数据库中最大的 XML 文件。我可以使用以下 XQuery 检索数据库中文档的大小(字节):

xdmp:binary-size(xdmp:unquote(xdmp:quote($doc),(),"format-binary")/binary())

$doc 是我获取字节大小的文档。

【问题讨论】:

  • 除非您在插入时计算此值并将其包含在文档元数据中,否则它不是“可搜索的”,即:您最终会将整个数据库加载到内存中以在查询时计算文件大小,并且可能会溢出缓存。
  • @wst 如果我的数据集非常少怎么办?资源管理器选项在查询控制台中如何工作?资源管理器速度太快,无法获取所有文档。
  • QConsole 浏览器能够从索引中获取大部分数据,未排序,并且是分页的,因此它一次不会读取超过 50 个文档.对于非常小的文档集(取决于文档的大小),您可以为 XQuery FLWOR 中的每个文档调用 xdmp:binary-size,并调用 order by 的值 descending

标签: xml max size xquery marklogic


【解决方案1】:

我发现以下查询很有用:

(
for $doc in cts:uri-match('*.xml')
order by string-length(fn:doc($doc)) descending
return $doc
)[position() = 1]

上述查询使用string-length 函数来查找文档中的字符数。当您正在搜索的文档中有特殊字符时,此查询很有用。

如果你想要字节数可以使用xdmp:binary-size,如下:

(
for $doc in cts:uri-match('*.xml')
order by xdmp:binary-size(xdmp:unquote(xdmp:quote(fn:doc($doc)),(),"format-binary")/binary()) descending
return $doc
)[position() = 1]

【讨论】:

    【解决方案2】:

    确实没有关于文档大小的索引来快速找到最大的。但是有一些选项可以查找大型文档。

    一种是运行批处理作业,使用上述函数扫描大型文档以计算大小。此外,将序列化长度与 XQuery string-length(xdmp:quote(doc($uri))) 或 JavaScript xdmp.quote(cts.doc("/my/uri/here")).length 一起使用会更简单一些。

    Corb 或 NiFi 或通过 xdmp.spawnFunction() 在任务服务器上生成函数可以在一段时间内执行类似的大型作业,您可以在其中检查每个文档的大小并存储记录或记录指示器(如果是)超过一定的尺寸限制。然后,您将搜索或使用 grep 查找最大的尺寸。

    有时,如果您知道较大文档中的结构和一些常用术语,则可以使用 cts.wordQuery("theCommonTerm") 和选项“min-occurs=number”。您需要调整最小出现次数以将内容缩小到最大的文档,然后仅对这些文档运行大小查询。

    【讨论】:

      猜你喜欢
      • 2022-08-22
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2014-01-28
      相关资源
      最近更新 更多