2012-05-11 29 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個,但數據時,數據是非常高的讓我們說50 LAC的

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

查詢上述部分會給XDMP-EXPNTREECACHEFULL例外,因爲我們正在努力在內存中緩存50個lac元素。
所以需要您的幫助,通過使用cts:搜索搜索:搜索 API才能獲得唯一的作者姓名。我不想先獲取結果集,然後使用fn:distinct-values()從結果集中提取不同的記錄。
謝謝,

回答

2

您可以在一個大的數據通過name建立一系列指標設置快速做到這一點。一旦你有了,使用cts:values()

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

此代碼假定您使用索引的默認排序規則。

請注意,如果您有一個通用元素名稱(如「name」),則可能希望使用路徑索引來更加精確。在這種情況下,你可能會建立在作者/名稱的路徑距離指標,然後

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

(我假設你正在使用MarkLogic 7+;如果沒有,你可以使用cts:element-values()代替CTS的:值( )。)

相關問題