我无法根据load_date过滤文档。我想计算在指定日期之前/之后加载的文档。我在db中有大约2200万个文档。我无法使用cts:element-range-query,因为开发人员没有在" load-date"上创建范围索引。元件。这使我无法从测试角度验证加载的内容。
请帮助我选择。
此致 哈
答案 0 :(得分: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:password@localhost: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 ()
答案 1 :(得分: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绝对是正确的方法。