2017-09-25 5 views
1

load_dateに基づいて文書をフィルタリングする際に問題があります。私は指定された日付の前後に読み込まれたドキュメントの数を取得したい。私はデータベースに約2200万の文書を持っています。開発者が "load-date"要素に範囲インデックスを作成していないので、私はcts:element-range-queryを使用することができません。これは、テストの観点からロードされたコンテンツの検証を停止しています。MarkLogic:load_dateが範囲指定されていない場合のload_dateに基づいた文書のフィルタリング

オプションを教えてください。

よろしく、 ハリ

答えて

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 
) 

これはおそらく動作しません。タイムアウトまたはツリーキャッシュの拡張エラーが発生する可能性があります。それがうまくいけば、このクエリはあなたのシステムがどの程度ビジーであるかに影響を与えることを期待してください。問題は、ソートされたインデックスなしで作業しているため、各ドキュメントを参照する必要があることです。あなたが可能ならば、オプション1は間違いなく正しい方法です。

+0

あなたのデイブとハンセンありがとうございました。私はXdmp:estimate、cts:directory-queryとXS:datetimeを使って達成することができます – Hari

2

CORB jobを実行すると、構成可能なスレッド数でこの大量のドキュメントを処理して、各ドキュメントURIのプロセスモジュールを実行して、指定した日付の前後にあるかどうかを判断できます。

CORBジョブは、load-date要素を持つドキュメント(またはドキュメントが評価するための基準)を持つ22M URIのバッチを選択してから、load-date要素にプロセスでカウントする必要がある値があるかどうかを評価できますこれらのドキュメントURIのすべてに対して実行されるモジュールです。ドキュメントをカウントする場合は、値を返します(ファイルサイズを小さくするには、1でも十分です)。POST-BATCH-TASKオプションを、com.marklogic.developer.corb.PostBatchUpdateFileTaskを順番に使用するように設定します。

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 
CORBジョブが完了したときに、単一のファイルにこれらの値のすべてを書くこと

を次に、あなたは、出力ファイルの行数をカウントすることができます

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