2012-10-09 27 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