2012-10-09 25 views
0

我有兩個示例XML文件如下:Marklogic:從元素字獲取字數詞典

abc.xml

<data> 
<text>i am a test user and doing testing here more and more. What are you doing?</text> 
<data> 

def.xml

<data> 
<text>We are a doing nothing here you can say it time pass. what are you doing?</text> 
<data> 

現在我爲<text>元素創建了單詞詞典。我感興趣的是以下幾點:

  1. 讓所有獨特的文字和其在整個DB數(有 僅上述兩個文件了)。
  2. 讓所有獨特字指定的文件

回答

1

1)對於所有獨特的文字和匹配碎片的數量:

for $w in cts:element-words(xs:QName('text')) 
return 
element word { 
    attribute count { 
     xdmp:estimate(cts:search(doc(), cts:word-query($w)) 
    }, 
    $w } 

這應該是相當快,但得到實際的字數而不是片段數,我認爲你可能必須檢查每個片段,並且這可能變得非常慢:

sum(
    cts:search(doc(), cts:word-query($w))/cts:highlight(., 
    cts:word-query($w),<match/>)/count(//match) 
) 

2)對於每個文件都是唯一的話:

for $d in doc() 
return element file { 
    for $w in cts:element-words(xs:QName('text'),(),(), 
     cts:document-query(xdmp:node-uri($d)) 
    return element word { $w } 
} 

如果你啓用了URI的詞彙,那麼你就可以進一步優化2)通過遍歷cts:uris(),而不是doc()並通過該值作爲第四個參數到cts:element-values(),而不是在doc上調用xdmp:node-uri

+0

我試圖執行上面的查詢(解決方案爲1),但它給了我錯誤的結果: 我是一個測試用戶,在這裏做測試越來越多。你在做什麼? <字數=「1」>我們在這裏什麼都不做,你可以說它的時間通過。你在做什麼? 我在這裏期待的個人字數如在我的情況下「哪裏」2次「做」3次等 – user1660340

+0

你確定你有一個單詞詞彙,而不是一個元素範圍指數?範圍索引是價值詞典,而不是單詞詞典,因此它們存儲每個元素的全部值,而不是單個詞。這是你的輸出結果。 – wst

+0

我已經在它上面創建了[單詞詞典和元素範圍索引]。我也嘗試通過刪除元素範圍索引,但在這種情況下,您的上面的查詢給我錯誤。因爲cts:element-values需要元素範圍索引。任何人都可以幫助我呢?沒有找到任何優化的解決方案 – user1660340