1

我无法根据 load_date 过滤文档。我想计算在指定日期之前/之后加载的文档。我在数据库中有大约 2200 万个文档。我无法使用 cts:element-range-query,因为开发人员尚未在“加载日期”元素上创建范围索引。这阻止了我从测试的角度验证加载的内容。

请帮我选择。

问候, 哈里

4

2 回答 2

2

您可以运行CORB 作业,它可以使用可配置数量的线程来处理大量文档,从而为每个文档 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 选项

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 ()
于 2017-09-27T03:01:26.530 回答
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 绝对是正确的方法。

于 2017-09-26T13:30:58.580 回答