我试图让xxx'使用如下查询的Marklogic中所有文档的参数:
(/doc/document)/xxx
但是由于我们有非常大的文档数据库,我得到一个错误"在主机"上扩展树缓存已满。我没有此服务器的管理员权限,因此我无法更改配置。我建议我可以在获取文档时使用范围:
(/doc/document)[1 to 1000]/xxx
然后
(/doc/document)[1000 to 2000]/xxx
等,但我担心我不知道它是如何工作的,例如,如果在此过程中数据库将被更改(将添加新文档)将会发生什么,它将如何影响结果文件清单?此外,我不知道在使用范围时使用的订单......
请澄清一下,这种方式是否恰当或是否有其他方法可以获得所有文件的参数?
答案 0 :(得分:3)
根据您的数据库的大小,可能无法在一个事务中获取所有值。 假设您有一万亿个文档,结果集会更大,然后可以在一个事务中返回。 这很重要吗?只有你的商业案例才能说清楚。 获取所有“xxx”值的最有效方法是使用范围索引。你可以看到它是如何工作的 使用cts:element-values(https://docs.marklogic.com/cts:element-values)
您需要能够在元素“xxxx”上创建范围索引才能执行此操作(请咨询您的DBA)。
然后cts:element-values()只返回 这些值以及能够返回大部分或全部值的机会 在一个signle事务的内存中使用xpath(/ doc / document / xxx)要高得多,因为你写的实际上会返回所有“xxx”元素(而不仅仅是它们的值)。最有可能需要实际加载匹配/ doc的每个文档,然后解析它并返回xxx元素。这可能既缓慢又低效。 范围索引只存储值,您可以检索这些值而无需加载实际文档。 通常,在处理大型数据集时,学习如何使用仅索引访问MarkLogic中的数据将产生最快的结果。