MarkLogic:当load_date不是范围索引时基于load_date过滤文档
我无法根据load_date过滤文档。我想记下在指定日期之前/之后加载的文档。 db中有大约2200万个文档。由于开发者尚未在“load-date”元素上创建范围索引,因此我无法使用cts:element-range-query。这阻止了我从测试角度验证加载的内容。MarkLogic:当load_date不是范围索引时基于load_date过滤文档
请帮我选择。
问候, 哈瑞
选项号1是让开发者创建在负载日期范围索引 - 即是解决这一确切的问题预期的方法和应是优选的解决方案。
如果你不能这样做(也许这是一次性查询,所以有阻力添加索引),但日期是在适当的YYYY-MM-DD格式,那么你可以做字符串比较。
fn:count(
for $item in fn:doc()
where $item/load_date/fn:string() gt "2015-01-01"
return $item
)
对于2200万个文件,这可能不起作用。您可能会遇到超时或扩展树缓存满错误。如果它确实起作用,则预计此查询会影响系统的繁忙程度。问题在于你在没有排序索引的情况下工作,所以你需要查看每个文档。如果可能的话,选项1绝对是正确的选择。
您可以运行一个CORB job,它可以使用可配置数量的线程处理大量文档,为每个文档URI执行一个处理模块,以确定它是否在指定日期之前/之后为load-date
。
CORB作业可以为具有load-date
元素的文档(或文档要评估的任何标准)选择一批22M URI,然后评估load-date
元素是否具有应在该过程中计数的值为每个文档URI执行的模块。如果文档应该被计数,则返回一个值(以保持文件的大小很小,即使只有1
就足够了)。配置POST-BATCH-TASK选项可以按顺序使用com.marklogic.developer.corb.PostBatchUpdateFileTask 。所有这些值写入一个文件
然后,CORB作业完成时,你可以指望线的输出文件的数量:
wc -l load-date-count.txt
XCC-CONNECTION-URI=xcc://user:[email protected]:8010
URIS-MODULE=uris.xqy|ADHOC
PROCESS-MODULE=process.xqy|ADHOC
THREAD-COUNT=10
POST-BATCH-TASK=com.marklogic.developer.corb.PostBatchUpdateFileTask
EXPORT-FILE-NAME=load-date-count.txt
#
# you might want to enable the DISK-QUEUE, so that the 22M URIs doesn't blow the JVM memory
#DISK-QUEUE=true
例uris.xqy模块:
xquery version "1.0-ml";
let $uris := cts:uris("",(),
cts:element-query(xs:QName("load-date"), cts:true-query()))
return
(count($uris), $uris)
例process.xqy模块:
xquery version "1.0-ml";
declare variable $URI as xs:string? external;
if (fn:doc($URI)/*/load-date/xs:date(.) gt xs:date("2017-09-26")) then 1
else()
谢谢你,Dave和汉森。我可以用Xdmp:estimate,cts:directory-query和XS:datetime来实现 – Hari