MarkLogic:当load_date未进行范围索引时,基于load_date过滤文档

时间:2017-09-25 15:09:43

标签: marklogic marklogic-9

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

请帮助我选择。

此致 哈

2 个答案:

答案 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绝对是正确的方法。