2012-05-11 9 views
4

私はこのようなXML文書を持っています。marklogicサーバーで異なる結果セットを取得

<Authors> 
     <Author> 
     <name>R.N Tagore</name> 
     <book>Gitanjli</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Panch Parameshvar</book> 
     </Author> 
     <Author> 
     <name>H.R Bacchan</name> 
     <book>Madhushala</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Gaban</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Nirmala</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Nirmala</book> 
     </Author> 
    </Authors> 

上記のXMLから、私は著者名の明確なリストが必要です。個別の値()機能の異なる著者名をフィルタします:私は上記のコードは何をするか、のような

fn:distinct-values(cts:search(fn:doc()//pa:Author/pa:name,cts:and-query(()))) 

をクエリを書くことができます。このため
はそれは著者名の結果を取得し、その後、fnは、ありますその結果セットから。データが非常に高い場合にのみ、XMLでデータ6、しかし、letのは、我々がしようとしているため、クエリの50ラックの

cts:search(fn:doc()//pa:Author/pa:name,cts:and-query(())) 

上記の部分はXDMP-EXPNTREECACHEFULL例外を与えるだろうと言うので、現在のシナリオでは、それが正常に動作しますメモリ内のlacの要素をキャッシュします。
cts:または検索:検索 APIを使用して、個別の著者名のみを取得するには、あなたの助けが必要です。最初に結果セットを取得してから、fn:distinct-values()を使用して、その結果セットから別のレコードを抽出する必要はありません。
ありがとう、

答えて

5

この質問は、私が読むことをお勧めしますMarkLogic Community websiteのフロントページの忍者のチュートリアルの途中で扱われます。

はあなたがname上の範囲のインデックスを設定することで、大きなデータセット上ですぐにこれを行うことができますhttp://community.marklogic.com/try/ninja/page7

2

を参照してください。一度それがあれば、cts:values()を使用してください。

cts:values(cts:element-reference(xs:QName("name"))) 

このコードでは、インデックスの既定の照合順序を使用することを前提としています。

"name"のような一般的な要素名がある場合は、より正確なパスインデックスを使用することができます。値(:いない場合は、あなたの代わりにCTSのcts:element-values()を使用することができます。この場合、あなたは(私はあなたがMarkLogic 7+を使用していると仮定してい

cts:values(cts:path-reference(xs:QName("Author/name"))) 

そして、著者/名前のパスの範囲のインデックスを設定できます)。

関連する問題