2017-09-25 69 views
1

我无法根据load_date过滤文档。我想记下在指定日期之前/之后加载的文档。 db中有大约2200万个文档。由于开发者尚未在“load-date”元素上创建范围索引,因此我无法使用cts:element-range-query。这阻止了我从测试角度验证加载的内容。MarkLogic:当load_date不是范围索引时基于load_date过滤文档

请帮我选择。

问候, 哈瑞

回答

1

选项号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绝对是正确的选择。

+0

谢谢你,Dave和汉森。我可以用Xdmp:estimate,cts:directory-query和XS:datetime来实现 – Hari

2

您可以运行一个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 

CORB options

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()